1

我知道我们可以使用不会立即通过单元测试的软断言ErrorCollector(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语句(可能需要多次测试运行,直到显示此单元测试的所有失败,这很耗时)。

4

2 回答 2

2

从 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同一测试方法中的规则一起使用。在单独的测试中它工作正常。

于 2018-12-09T16:32:28.580 回答
2

使用软断言你可以这样做:

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 将完成报告工作。

于 2019-03-27T08:46:29.733 回答