EvictingConnectionLogger implements ConnectionLogger { @Override public void failure(final ConnectionMonitor.InfoProvider infoProvider, @Nullable final DittoRuntimeException dittoRuntimeException) { if (null != dittoRuntimeException) { failure(infoProvider, defaultFailureMessage, dittoRuntimeException.getMessage() + dittoRuntimeException.getDescription().map(" "::concat).orElse("")); } else { failure(infoProvider, defaultFailureMessage, FALLBACK_EXCEPTION_TEXT); } } private  EvictingConnectionLogger(final Builder builder); @Override void success(final ConnectionMonitor.InfoProvider infoProvider); @Override void success(final ConnectionMonitor.InfoProvider infoProvider, final String message,
            final Object... messageArguments); @Override void failure(final ConnectionMonitor.InfoProvider infoProvider,
            @Nullable final DittoRuntimeException dittoRuntimeException); @Override void failure(final ConnectionMonitor.InfoProvider infoProvider, final String message,
            final Object... messageArguments); @Override void exception(final ConnectionMonitor.InfoProvider infoProvider, @Nullable final Exception exception); @Override void exception(final ConnectionMonitor.InfoProvider infoProvider, final String message,
            final Object... messageArguments); @Override void clear(); @Override Collection<LogEntry> getLogs(); @SuppressWarnings("OverlyComplexMethod") @Override boolean equals(@Nullable final Object o); @Override int hashCode(); @Override String toString();  }
@Test public void failureDoesntFailOnNullException() { final EvictingConnectionLogger logger = builder().build(); logger.failure(randomInfoProvider(), null); LogEntryAssertions.assertThat(getFirstAndOnlyEntry(logger)) .isNotNull(); }