RollbarThrowableWrapper implements ThrowableWrapper { @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } RollbarThrowableWrapper that = (RollbarThrowableWrapper) o; if (className != null ? !className.equals(that.className) : that.className != null) { return false; } if (message != null ? !message.equals(that.message) : that.message != null) { return false; } if (!Arrays.equals(stackTraceElements, that.stackTraceElements)) { return false; } if (cause != null ? !cause.equals(that.cause) : that.cause != null) { return false; } return throwable != null ? throwable.equals(that.throwable) : that.throwable == null; } RollbarThrowableWrapper(Throwable throwable);  RollbarThrowableWrapper(String className, String message,
      StackTraceElement[] stackTraceElements,
      ThrowableWrapper cause); private  RollbarThrowableWrapper(String className, String message,
      StackTraceElement[] stackTraceElements, ThrowableWrapper cause, Throwable throwable); @Override String getClassName(); @Override String getMessage(); @Override StackTraceElement[] getStackTrace(); @Override ThrowableWrapper getCause(); @Override Throwable getThrowable(); @Override String toString(); @Override boolean equals(Object o); @Override int hashCode();  }
@Test public void shouldBeEqual() { Throwable throwable = new IllegalArgumentException("This is the throwable message"); RollbarThrowableWrapper sut1 = new RollbarThrowableWrapper(throwable); RollbarThrowableWrapper sut2 = new RollbarThrowableWrapper(throwable); assertTrue(sut1.equals(sut2)); }