JUnit:如何将我的所有方法公开以便进行测试

时间:2012-04-19 13:00:34

标签: java unit-testing junit mocking

我开始在我的项目中使用JUnit和Mockito,我很快注意到的是我最终将我的私有方法转换为public以便从测试类中加入,这是一个非常糟糕的解决方案。

有时仅测试公共方法就足够了,但有时我也想测试一些内部方法。这有解决方法吗?例如,一个特殊的注释,允许JUnit将私有方法模拟为公共或类似的东西?

4 个答案:

答案 0 :(得分:5)

您的公共方法必须调用您的私有方法。 因此,您可以通过制作公共方法的测试函数来测试您的私有方法。

如果你仍想通过Junits测试私人功能,可以使用reflection来完成。

您必须设置方法setAccessible==true.

的属性

示例:

 public void testisvalid() throws Exception 
    {
        MyHandler handler = new MyHandler();
        Method privateStringMethod = MyHandler.class.getDeclaredMethod("isvalid", Long.class);
        privateStringMethod.setAccessible(true);
        String =  (String) privateStringMethod.invoke(handler, 852l );
        assertNotNull(s);
    }

getDeclaredMethod中,您必须提供private方法的名称,以及您在函数中按顺序传递的arguments的类型。

答案 1 :(得分:5)

直接测试私有方法的需要是设计气味。在设计良好的类中,所有功能都是可访问的,合理的,因此可以通过其公共接口进行测试。

缺乏这一点通常意味着你的班级太大而且复杂,试图同时处理多个职责。对此最好的解决方案是重构:将一些功能提取到一个单独的类中,在那里它可以公开,因此可以直接进行单元测试。

答案 2 :(得分:3)

要问的第一个问题是:这些私有方法是否可以成为其他帮助程序类的公共接口的一部分。在这种情况下,您可以测试此助手类,并在原始类中注入模拟助手。

如果不可能,那么使这些私有方法受到保护,记录它们仅受保护以便进行测试并且不应该被子类调用或覆盖它们的事实,并将测试类放在相同的包装中作为被测试的类,能够访问这种受保护的方法。

在这种情况下,我使用Guava提供的@VisibleForTesting注释。

答案 3 :(得分:2)

我的maven构建基础结构为测试源提供了一个单独的目录,但具有相同的包结构。因此,如果方法不公开但可以访问包,那就足够了。