如何在 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 将完成报告工作。
我知道我们可以使用 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 将完成报告工作。