无效方法的单元测试

时间:2015-02-12 16:21:18

标签: java junit mockito

我需要为一些具有未知/不可预测副作用的静态 void方法编写单元测试。例如

public void doSth() {
    try {
        HttpPostUtil.sendRequest("abc", "xyz");
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

HttpPostUtil在另一个jar文件中。它不受我的控制,它会将数据发布到某些Web服务。在这种情况下我们可以做什么测试方法? (PowerMockito此处不允许:()

2 个答案:

答案 0 :(得分:4)

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

  1. 用对象包装对HttpPostUtil的调用,以便不将其作为静态对象并在测试中进行模拟(通过mockito或将实现注入到对象中)。这叫做sprout class。
  2. 将HttpPostUtil调用包装到方法中,并在测试套件中将其覆盖到其他位置。
  3. 一般来说 - 如果难以测试 - >它很难使用 - >实施不好 - >所以它需要重构,而不是调整测试。

答案 1 :(得分:0)

在测试方法时,您应始终只测试该方法并模拟对其他方法的其他调用。因为其他方法应该在他们自己的测试方法中进行测试。

如果您还想测试捕获案例,那么您只需要进行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
}