Junit - 断言列表包含

时间:2017-03-12 08:14:07

标签: java arraylist junit

我正在创建一个包含很少元素的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);
}

我想使用&#39;包含&#39;为了不依赖于订单。 我试过像:

 assertTrue(Arrays.asList(reporters).contains((Arrays.asList(ClientConfig.MetricsReporterType.LOG, ClientConfig.MetricsReporterType.GRAPHITE, ClientConfig.MetricsReporterType.CLOUD_WATCH))));

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

4 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

使用普通的JUnit开箱即用的方法并不是一个简单的方法。 您可以使用@JBNizet在他的答案中演示的技术,开发一种辅助方法,以便轻松实现。

或者你可以使用一个可以帮助解决这个问题的额外测试库。 例如,使用AssertJ可以执行此操作:

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

// ...

assertThat(reporters).extracting("class").contains(
    Slf4jReporter.class,
    GraphiteReporter.class,
    CloudWatchReporter.class
);

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

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.4.1</version>
</dependency>

答案 2 :(得分:0)

问题是您正在尝试检查reporters列表是否包含列表,但由于您已指定它包含ScheduledReporter的实例,因此它不会包含列表。我没有使用过任何一个类,所以我无法提供更优雅的解决方案,但以下内容应该有效:

@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;
}

答案 3 :(得分:0)

你可以使用布尔变量并通过数组进行交互。如果找到了所需的元素,请将bool变量设置为true。迭代后,断言变量为真。