无效方法的单元测试
Unit test for void method
我需要为某些具有 unknown/unpredictable 副作用的 static void
方法编写单元测试。例如
public void doSth() {
try {
HttpPostUtil.sendRequest("abc", "xyz");
} catch(Exception ex) {
ex.printStackTrace();
}
}
HttpPostUtil
在另一个 jar 文件中。这是我无法控制的,它会将数据 post 传送到某些 Web 服务。在这种情况下我们可以采用什么测试方法? (这里不允许 PowerMockito
:()
因为它是无效方法,所以您唯一可以测试的就是行为。在这种情况下你几乎没有选择
- 使用对象包装对 HttpPostUtil 的调用,以免将其作为静态对象并在测试中对其进行模拟(通过 mockito 或将您的实现注入对象)。这叫萌芽class.
- 将对 HttpPostUtil 的调用包装到该方法中,并在测试套件中将其覆盖为其他内容。
一般来说 - 如果很难测试 -> 很难使用 -> 实现不好 -> 所以它需要重构,而不是调整测试。
在测试方法时,您应该始终仅测试该方法并模拟对其他方法的其他调用。因为其他的方法应该都在自己的测试方法中测试过了
这里如果你还想测试catch case,你只需要2个测试。使用 Mockito:
@InjectMocks
private YourClass yourClass;
@Mock
private HttpPostUtil httpPostUtil;
@Test
public void testDoSthPositive() {
// Run Test
yourClass.doSth();
// Control
verify(httpPostUtil).sendRequest("abc", "xyz");
verifyNoMoreInteractions(httpPostUtil); // Optional
}
@Test
public void testDoSthNegative() {
// Preparation
NullPointerException exceptionMock = mock(NullPointerException.class);
doThrow(exceptionMock).when(httpPostUtil).sendRequest("abc", "xyz");
// Run Test
yourClass.doSth();
// Control
verify(exceptionMock).printStackTrace();
verifyNoMoreInteractions(exceptionMock, httpPostUtil); // Optional
}
我需要为某些具有 unknown/unpredictable 副作用的 static void
方法编写单元测试。例如
public void doSth() {
try {
HttpPostUtil.sendRequest("abc", "xyz");
} catch(Exception ex) {
ex.printStackTrace();
}
}
HttpPostUtil
在另一个 jar 文件中。这是我无法控制的,它会将数据 post 传送到某些 Web 服务。在这种情况下我们可以采用什么测试方法? (这里不允许 PowerMockito
:()
因为它是无效方法,所以您唯一可以测试的就是行为。在这种情况下你几乎没有选择
- 使用对象包装对 HttpPostUtil 的调用,以免将其作为静态对象并在测试中对其进行模拟(通过 mockito 或将您的实现注入对象)。这叫萌芽class.
- 将对 HttpPostUtil 的调用包装到该方法中,并在测试套件中将其覆盖为其他内容。
一般来说 - 如果很难测试 -> 很难使用 -> 实现不好 -> 所以它需要重构,而不是调整测试。
在测试方法时,您应该始终仅测试该方法并模拟对其他方法的其他调用。因为其他的方法应该都在自己的测试方法中测试过了
这里如果你还想测试catch case,你只需要2个测试。使用 Mockito:
@InjectMocks
private YourClass yourClass;
@Mock
private HttpPostUtil httpPostUtil;
@Test
public void testDoSthPositive() {
// Run Test
yourClass.doSth();
// Control
verify(httpPostUtil).sendRequest("abc", "xyz");
verifyNoMoreInteractions(httpPostUtil); // Optional
}
@Test
public void testDoSthNegative() {
// Preparation
NullPointerException exceptionMock = mock(NullPointerException.class);
doThrow(exceptionMock).when(httpPostUtil).sendRequest("abc", "xyz");
// Run Test
yourClass.doSth();
// Control
verify(exceptionMock).printStackTrace();
verifyNoMoreInteractions(exceptionMock, httpPostUtil); // Optional
}