[英]JUnit ~ Assert that list contains objects with the same values in any order
[英]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.