【问题标题】:How to use Mockito properly on Static methods wrapped inside non-static methods?如何在包含在非静态方法中的静态方法上正确使用 Mockito?
【发布时间】:2017-06-21 03:57:24
【问题描述】:

所以我试图在其中包含静态方法的方法上使用 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 的情况下完成这项工作并实现代码覆盖?非常感谢你的帮助。

【问题讨论】:

  • 无关:您的代码示例中有拼写错误。您声明 ioutils - 但随后您使用 ioutils2
  • 除了有点不清楚:第一个问题很好。我特别喜欢你对实现高质量的态度(尽管我的回答在这里走向不同的方向)你对你想要避免 PowerMock 的理解。我希望我能再为你投票 3 次!
  • 最后,再次无关:假设您使用的是 Apache IOUtils.toString() - 请注意此方法已弃用,您应该使用采用编码的方法!

标签: java mockito code-coverage static-methods


【解决方案1】:

我的两分钱在这里:

  • 我什至会更进一步,定义一个接口来表示功能
  • 另一方面,我不会“过火”测试包装器实现

重点是:这里只有一点点胶水代码。如果您能够测试此代码以验证此胶水代码是否有效 - 那么您就可以了。

换句话说:避免为实现 100% 的覆盖率而烦恼! Coverage 是一个工具,旨在帮助您实现代码质量。

100% 的覆盖率不会导致“100% 的代码质量”!

您可以通过尝试“始终做正确的事情”来提高代码质量。

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

我猜如果不使用 PowerMock(ito),您将无法实现该目标。避免 PowerMock(ito) 本身就是一件好事——我的建议是:接受你不能 100% 覆盖这个课程。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多