如何在 JUnit 测试中使用 ExpectedException 验证生产代码中的断言错误

How to validate assertion error in production code with ExpectedException in a JUnit test

在生产代码中的方法 myMethod 某处有一个断言,例如:

public void myMethod(List list1, List list2) {
 assert list1.size() == list2.size()
}

和单元测试

@Rule
public ExpectedException ex = ExpectedException.none();

@Test
public void test() throws Exception {
 ex.expect(java.lang.AssertionError.class);
 myMethod(Arrays.asList(1, 2), Arrays.asList(1, 2, 3));
}

我希望单元测试成功 运行 但我得到了 AssertionError。为什么会这样?

假设您使用的是 4.11,javadoc of ExpectedException 状态

By default ExpectedException rule doesn't handle AssertionErrors and AssumptionViolatedExceptions, because such exceptions are used by JUnit. If you want to handle such exceptions you have to call handleAssertionErrors() or handleAssumptionViolatedExceptions().

假设使用 -ea 选项启用断言,只需添加对 handleAssertionErrors()

的调用
@Test
public void test() throws Exception {
    ex.handleAssertionErrors();
    ex.expect(java.lang.AssertionError.class);
    myMethod(Arrays.asList(1, 2), Arrays.asList(1, 2, 3));
}

You should no longer need the above in JUnit 4.12 (or in versions 10 and under).

Deprecated. AssertionErrors are handled by default since JUnit 4.12. Just like in JUnit <= 4.10.

This method does nothing. Don't use it.