簡體   English   中英

Junit - 斷言列表包含

[英]Junit - assert the list contains

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

我想使用'包含'以便不依賴於訂單。 我嘗試過類似的東西:

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

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

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));

開箱即用的簡單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>

問題是您正在嘗試檢查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;
}

你可以使用布爾變量並通過數組進行交互。 如果找到了所需的元素,請將bool變量設置為true。 迭代后,斷言變量為真。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM