Estoy creando una Lista (ArrayList) que contiene pocos elementos. Quiero asegurarme de que contiene los elementos que agregué. ahora, esto funciona solo algunas veces, ya que el orden cambia:
@Test public void testThreeReporters(){ ClientConfig myConfig = new ClientConfigFactory().getConfig().withMetricsReporters(new HashSet<>(Arrays.asList(ClientConfig.MetricsReporterType.LOG, ClientConfig.MetricsReporterType.GRAPHITE, ClientConfig.MetricsReporterType.CLOUD_WATCH))); List<ScheduledReporter> reporters = MetricsFactory.configureMetricsReporters(MetricsFactory.createMetricsClient(),myConfig); assertEquals(3, reporters.size()); assertTrue(reporters.get(2) instanceof Slf4jReporter); assertTrue(reporters.get(1) instanceof GraphiteReporter); assertTrue(reporters.get(0) instanceof CloudWatchReporter); }Quiero usar 'contiene' para no depender del pedido. Intenté algo como:
assertTrue(Arrays.asList(reporters).contains((Arrays.asList(ClientConfig.MetricsReporterType.LOG, ClientConfig.MetricsReporterType.GRAPHITE, ClientConfig.MetricsReporterType.CLOUD_WATCH))));y algunas otras combinaciones, pero no funciona.
assertEquals(3, reporters.size()); assertTrue(reporters.stream().anyMatch(e -> e instanceof Slf4jReporter)); assertTrue(reporters.stream().anyMatch(e -> e instanceof GraphiteReporter)); assertTrue(reporters.stream().anyMatch(e -> e instanceof CloudWatchReporter));Realmente no hay una manera fácil de hacer esto con JUnit simple listo para usar. Podría desarrollar un método de ayuda para facilitar esto usando la técnica demostrada por @JBNizet en su respuesta.
O podría usar una biblioteca de prueba adicional que puede ayudar con esto. Por ejemplo, usando AssertJ podrías hacer esto:
import static org.assertj.core.api.Assertions.assertThat; // ... assertThat(reporters).extracting("class").contains( Slf4jReporter.class, GraphiteReporter.class, CloudWatchReporter.class );Si usa Maven, puede agregar una dependencia de assertj como esta:
<dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.4.1</version> </dependency>El problema es que está tratando de verificar si la lista de reporters contiene una lista, que no es así, ya que especificó que contiene instancias de ScheduledReporter . No he usado ninguna de esas clases, por lo que no puedo proporcionar una solución más elegante, pero lo siguiente debería funcionar:
@Test public void testThreeReporters() { ClientConfig myConfig = new ClientConfigFactory().getConfig().withMetricsReporters(new HashSet<>(Arrays.asList(ClientConfig.MetricsReporterType.LOG, ClientConfig.MetricsReporterType.GRAPHITE, ClientConfig.MetricsReporterType.CLOUD_WATCH))); List<ScheduledReporter> reporters = MetricsFactory.configureMetricsReporters(MetricsFactory.createMetricsClient(),myConfig); assertEquals(3, reporters.size()); assertTrue("No Slf4jReporter was found", containsReporter(reporters, Slf4jReporter.class)); assertTrue("No GraphiteReporter was found", containsReporter(reportera, GraphiteReporter.class)); assertTrue("No CloudWatchReporter was found", containsReporter(reporters, CloudWatchReporter.class)); } /** * @return {@code true} if {@code reporters} contains an object of type * {@code expectedClass}, otherwise {@code false}. */ private boolean containsReporter(List<ScheduledReporter> reporters, Class expectedClass) { for (ScheduledReporter reporter : reporters) { if (expectedClass.isInstance(reporter)) { return true; } } return false; }