我正在创建一个包含很少元素的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))));
和其他一些组合,但它不起作用。
答案 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。迭代后,断言变量为真。