繁体   English   中英

无效方法的单元测试

[英]Unit test for void method

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

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

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

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

  1. 使用对象包装对HttpPostUtil的调用,以使其不为静态对象,并在测试中对其进行模拟(通过模拟或将实现注入到对象中)。 这称为新芽类。
  2. 将对HttpPostUtil的调用包装到方法中,并在测试套件中将其重写为其他方法。

一般来说-如果很难测试->很难使用->实现不好->因此需要重构,而不是调整测试。

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

在这里,如果您还想测试捕获盒,则只需进行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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM