如何在非静态方法中包含的静态方法上正确使用Mockito?

时间:2017-06-21 03:57:25

标签: java mockito code-coverage static-methods

所以我试图在一个有静态方法的方法上使用Mockito。原因是我无法使用PowerMock,因此我将方法包装在非静态方法中。

public class WrapperUtil {

    public String getURLContent(String path) throws IOException{
        URL url = new URL(path);
        return IOUtils.toString(url);
    }
}

现在我以两种不同的方式测试了WrapperUtil类。一个测试工作,但没有为WrapperUtil类提供任何覆盖,另一个是抛出与静态方法相关的空指针异常。

这是有效的,但没有提供任何报道。

@RunWith(MockitoJUnitRunner.class)
public class WrapperUtilTest {

    @InjectMocks
    WrapperUtil ioutils;


    @Before
    public void setUp() throws Exception {

        ioutils = new WrapperUtil();
    }

    @Test
    public void testGetUrlContent() throws IOException {

        WrapperUtil ioutilsSpy = Mockito.spy(ioutils);
        Mockito.doReturn("test").when(ioutilsSpy).getURLContent(Mockito.anyString());
        assertTrue(ioutils2.getURLContent("test").contains("test"));

    }

}

这是不起作用的那个:

@RunWith(MockitoJUnitRunner.class)
public class WrapperUtilTest {

    @InjectMocks
    WrapperUtil ioutils;


    @Before
    public void setUp() throws Exception {

        ioutils = new WrapperUtil();
    }

    @Test
    public void testGetUrlContent() throws IOException {

        WrapperUtil ioutilsSpy = Mockito.spy(ioutils);
        Mockito.when(ioutilsSpy).getURLContent(Mockito.anyString()).thenReturn("test");
        assertTrue(ioutils2.getURLContent("test").contains("test"));

    }

}

如何在不使用PowerMockito的情况下完成此工作并实现代码覆盖?非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我的两分钱:

  • 我甚至会更进一步,定义界面来表示功能
  • 另一方面,我不会“过度”测试包装器实现

重点是:这里只有一小部分 glue 代码。如果您能够测试此代码以验证此粘合代码是否有效 - 那么您没问题。

换句话说:避免挂断实现100%的覆盖率!覆盖范围是工具,旨在帮助您实现代码质量。

100%覆盖导致“100%代码质量”!

通过尝试“始终做正确的事”来实现代码质量。

在这里,“正确的事情”不是争取100%的覆盖率。

我猜你不会在没有转向PowerMock(ito)的情况下实现这个目标。因为避免使用PowerMock(ito)本身就是一件好事 - 我的建议是:简单地接受你无法获得100%的覆盖率。

如果有的话,我会花时间尝试从覆盖范围内排除此类。