如何在 Mockito 中使用软断言?

How to use soft assertions in Mockito?

我知道我们可以使用 ErrorCollector or soft assertions(AssertJ 或 TestNG)不会立即通过单元测试。

如何将它们与 Mockito 断言一起使用?或者,如果他们不能,Mockito 是否提供任何替代方案?


代码示例

verify(mock).isMethod1();
verify(mock, times(1)).callMethod2(any(StringBuilder.class));
verify(mock, never()).callMethod3(any(StringBuilder.class));
verify(mock, never()).callMethod4(any(String.class));

问题

在这段代码中,如果验证失败,则测试将失败,这将中止剩余的 verify 语句(可能需要多次运行测试,直到显示此单元测试的所有失败,这很耗时)。

从 Mockito 2.1.0 开始,您可以使用 VerificationCollector 规则来收集多个验证失败并立即报告。

例子

import static org.mockito.Mockito.verify;
import org.junit.Rule;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.VerificationCollector;

// ...

    @Rule
    public final VerificationCollector collector = MockitoJUnit.collector();


    @Test
    public void givenXWhenYThenZ() throws Exception {
        // ...
        verify(mock).isMethod1();
        verify(mock, times(1)).callMethod2(any(StringBuilder.class));
        verify(mock, never()).callMethod3(any(StringBuilder.class));
        verify(mock, never()).callMethod4(any(String.class));
    }

已知问题

此规则不能与 ErrorCollector 规则在同一个测试方法中使用。在单独的测试中它工作正常。

使用软断言你可以做到:

softly.assertThatThrownBy(() -> verify(mock).isMethod1()).doesNotThrowAnyException();
softly.assertThatThrownBy(() -> verify(mock, times(1)).callMethod2(any(StringBuilder.class))).doesNotThrowAnyException();
softly.assertThatThrownBy(() -> verify(mock, never()).callMethod3(any(StringBuilder.class))).doesNotThrowAnyException();
softly.assertThatThrownBy(() -> verify(mock, never()).callMethod4(anyString())).doesNotThrowAnyException();

如果您的一个或多个 mockito 断言失败,它将触发异常,softAssertion 将完成报告工作。