Junit - 断言列表包含

use*_*391 4 java junit arraylist

我正在创建一个包含很少元素的List(ArrayList).我想确保它包含我添加的元素.现在,由于订单发生变化,这只在某些时候起作用:

@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);
}
Run Code Online (Sandbox Code Playgroud)

我想使用'包含'以便不依赖于订单.我尝试过类似的东西:

 assertTrue(Arrays.asList(reporters).contains((Arrays.asList(ClientConfig.MetricsReporterType.LOG, ClientConfig.MetricsReporterType.GRAPHITE, ClientConfig.MetricsReporterType.CLOUD_WATCH))));
Run Code Online (Sandbox Code Playgroud)

和其他一些组合,但它不起作用.

JB *_*zet 11

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));
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 4

使用开箱即用的普通 JUnit 确实没有一种简单的方法可以做到这一点。您可以开发一种辅助方法,使用@JBNizet在他的答案中演示的技术来简化此操作。

或者您可以使用额外的测试库来帮助解决此问题。例如使用AssertJ你可以这样做:

import static org.assertj.core.api.Assertions.assertThat;

// ...

assertThat(reporters).extracting("class").contains(
    Slf4jReporter.class,
    GraphiteReporter.class,
    CloudWatchReporter.class
);
Run Code Online (Sandbox Code Playgroud)

如果你使用Maven,你可以像这样添加assertj依赖:

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.4.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)