无效方法的单元测试

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 :()

因为它是无效方法,所以您唯一可以测试的就是行为。在这种情况下你几乎没有选择

  1. 使用对象包装对 HttpPostUtil 的调用,以免将其作为静态对象并在测试中对其进行模拟(通过 mockito 或将您的实现注入对象)。这叫萌芽class.
  2. 将对 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
}