在JUnit测试中,有没有办法可以确保所有断言都已执行?

时间:2016-01-27 19:14:14

标签: java junit lambda java-8 junit4

我有ProducerConsumerProducer同步写入消息。消费者是一个每秒轮询消息的线程。

我有这样的测试:

@Test
public void shouldConsumeMessageWhenMessageIsProduced() {
    final Message expectedMessage = new Message("test");
    //consumer will poll every 1 second for a message
    consumer.poll((actualMessage) -> {assertThat(actualMessage), is(expectedMessage));
    producer.sendSynchronously(expectedMessage);
    Thread.sleep(3000);      
}

此测试有效。但是,我无法确保实际调用断言。

我意识到我可以使用Mockito,但我也意识到这更像是集成测试,而不是单元测试。但是在JUnit中是否存在确保所有断言都已执行的情况?

请注意,由于断言是在lambda中,我无法递增变量或设置标志。

2 个答案:

答案 0 :(得分:3)

我会根据您的偏好使用lambda表达式中的var value;AtomicBoolean。有关示例,请参阅以下代码:

MutableBoolean

编辑:我刚刚意识到你的问题是" 所有断言"。因此,您可以以相同的方式等效地使用Apache's MutableInt classJava's AtomicInteger,只需递增直到达到正确的数字。

答案 1 :(得分:2)

您似乎希望测试等到触发断言,可能是超时。 CountDownLatch可以完成这项任务:

@Test
public void shouldConsumeMessageWhenMessageIsProduced() {
    final Message expectedMessage = new Message("test");

    CountDownLatch messageReceived = new CountDownLatch(1);

    //consumer will poll every 1 second for a message
    consumer.poll(actualMessage -> {
      assertThat(actualMessage, is(expectedMessage));
      messageReceived.countDown();
    }

    producer.sendSynchronously(expectedMessage);

    //wait until the message is received, but not more than one second
    //await returns false if it reaches the timeout
    assertTrue(messageReceived.await(1, SECONDS));
}

如果您希望消费者中的断言被触发n次,您可以更改锁定的初始计数:CountDownLatch latch = new CountDownLatch(n);