java - 在 JUnit 测试中,有没有一种方法可以确保所有断言都已执行?

标签 java junit lambda java-8 junit4

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

我有这样的测试:

@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 中,我无法增加变量或设置标志。

最佳答案

我会根据您的喜好从您的 lambda 表达式中使用 AtomicBooleanMutableBoolean。有关示例,请参见以下代码:

import static org.junit.Assert.assertTrue;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.lang.mutable.MutableBoolean;
import org.junit.Test;

public class AssertionLambdaTest {
    @Test
    public void assertExecutedWithAtomicBoolean() {
        AtomicBoolean myBoolean = new AtomicBoolean(false);
        doStuff(() -> {
            assertTrue(true);
            myBoolean.set(true);
        });
        assertTrue(myBoolean.get());
    }

    @Test
    public void assertExecutedWithMutableBoolean() {
        MutableBoolean myBoolean = new MutableBoolean(false);
        doStuff(() -> {
            assertTrue(true);
            myBoolean.setValue(true);
        });
        assertTrue(myBoolean.booleanValue());
    }

    private void doStuff(Runnable runner) {
        runner.run();
    }
}

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

关于java - 在 JUnit 测试中,有没有一种方法可以确保所有断言都已执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35046047/

相关文章:

java - gradle junit 测试使用 slf4j 进行日志记录

java - OSGi 单元测试和包导出

c++ - 通用 lambda 和一元 + 运算符

c# - Where 方法如何运行?

c++ - std::transform 以两个 std::vector 和一个常量作为参数

java - 在 for 循环中等待输入的最佳方法?

java - 长类型名称会影响性能吗?

java - 使用 cucumber-java 和 junit 时如何获取 cucumber RuntimeOptions 的引用?

Java:如何忽略具有 null 的字段并仅通过修改后的属性传递

java - jsp 文件中无法建立 jdbc 连接