注释使私有方法仅对测试类公开

Kum*_*tix 83 java junit unit-testing annotations

谁有针对这一共同需求的解决方案.

我的应用程序中有一个类.

一些方法是公共的,因为它们是api的一部分,有些是私有的,因为它们用于内部使用,使内部流程更具可读性

现在,我想写一个单元测试,或者更像是集成测试,它将位于不同的包中,允许调用此方法,但是,我希望不允许正常调用此方法如果你试图从应用程序本身的类中调用它

所以,我在想这样的事情

public class MyClass {

   public void somePublicMethod() {
    ....
   }

   @PublicForTests
   private void somePrivateMethod() {
    ....
   }
}
Run Code Online (Sandbox Code Playgroud)

上面的注释将私有方法标记为"公共测试",这意味着,对于任何在test ...包下的类,将允许编译和运行时,而编译和\或运行时将对任何类失败不在测试包下.

有什么想法吗?有这样的注释吗?有一个更好的方法吗?

似乎你写的单元测试越多,你的更多信息就会破坏你的封装......

JB *_*zet 122

常见的方法是使私有方法受保护或包私有,并将此方法的单元测试放在与被测试类相同的包中.Guava有一个@VisibleForTesting注释,但它仅用于文档目的.

  • 如果你使用FindBugs,我已经构建了[一个可以实际验证的插件](https://github.com/Monits/findbugs-plugin),你可以在测试类之外使用`@ VisibleForTesting`方法. (18认同)

Cyg*_*sx1 21

如果您的测试覆盖率对于测试类中的所有公共方法都很好,那么公共调用的私有方法将自动进行测试,因为您将断言所有可能的情况.

JUnit Doc说:

测试私有方法可能表明这些方法应该转移到另一个类中以提高可重用性.但是如果必须......如果您使用的是JDK 1.3或更高版本,则可以使用反射来借助PrivilegedAccessor来破坏访问控制机制.有关如何使用它的详细信息,请 阅读本文.

  • 我认为这个答案忽略了问题的要点:私有方法对于测试它们不可见,但对于访问它们是可见的。可能是为了断言某种状态或使用难以注入的模拟对象进行初始化。 (3认同)
  • IMO 在最里面的点进行测试非常重要,因此其他一些公共方法调用的小型私有方法。您不应该为某些“不相关”的外部公共方法编写测试,并且必须完美地设置所有内容,以便您的内部/私有方法恰到好处。相反,无论从何处调用它,都应单独测试内部/私有方法以验证其功能。 (2认同)

Nat*_*hes 10

考虑使用接口来公开API方法,使用工厂或DI来发布对象,以便消费者仅通过接口了解它们.该界面描述了已发布的API.这样,您可以在实现对象上创建任何您想要公开的内容,并且它们的使用者只能看到通过该接口公开的那些方法.


sim*_*ico 5

dp4j有您需要的。本质上,您要做的就是将dp4j添加到类路径中,每当用@Test(JUnit的注释)注释的方法调用私有方法时,它将起作用(dp4j将在编译时注入所需的反射)。您也可以使用dp4j的@TestPrivates批注更明确。

如果您还坚持要注释自己的私有方法,则可以使用Google的@VisibleForTesting注释。


Atr*_*eys 3

关于测试私有方法的文章列出了一些测试私有代码的方法。使用反射会给程序员带来额外的负担,因为要记住重构是否完成,字符串不会自动更改,但我认为这是最干净的方法。