注释使私有方法只对testing类公开

谁有这个共同需求的解决scheme。

我在申请中有一堂课。

有些方法是公开的,因为它们是api的一部分,有些是私有的,因为它们是内部使用的,使内部stream动更可读

现在,我想写一个unit testing,或者更像是一个集成testing,它将位于不同的包中,这将允许调用这个方法,但是,我希望这个方法的正常调用将不被允许如果您尝试从应用程序本身的类中调用它

所以,我在想这样的事情

public class MyClass { public void somePublicMethod() { .... } @PublicForTests private void somePrivateMethod() { .... } } 

上面的注解将私有方法标记为“public for test”,这意味着编译和运行时将被允许用于任何在test … package下的类,而编译和/或运行时将失败的任何类不在testing包下。

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

看起来你写的unit testing越多,为了破解你的封装就越多。

通常的做法是使私有方法受保护或包私有,并将此方法的unit testing放在与被testing类相同的包中。 Guava有一个@VisibleForTesting注释 ,但它仅用于文档目的。

如果你的testing覆盖率在被testing类中的所有公共方法上都很好,那么公共方法调用的私有方法将被自动testing,因为你将声明所有可能的情况。

JUnit Doc说:

testing私有方法可能意味着这些方法应该被移入另一个类来提高可重用性。 但是,如果您必须…如果您使用JDK 1.3或更高版本,则可以使用reflection来借助PrivilegedAccessor来颠覆访问控制机制。 有关如何使用它的详细信息,请阅读这篇文章。

考虑使用接口来公开API方法,使用工厂或DI来发布对象,以便消费者仅通过接口来了解它们。 该接口描述了已发布的API。 这样你就可以在实现对象上做任何你想公开的东西,而它们的消费者只能看到通过接口公开的那些方法。

dp4j有你所需要的。 基本上你所要做的就是将dp4j添加到你的类path中,每当用@Test注解的方法(JUnit的注释)调用一个私有的方法,它就会工作(dp4j将在编译时注入所需的reflection)。 您也可以使用dp4j的@TestPrivates注释来更加明确。

如果你坚持也注释你的私有方法,你可以使用Google的@VisibleForTesting注解。

有关testing私有方法的文章列举了一些testing私有代码的方法。 使用reflection给程序员带来了额外的负担,要记住重构是否完成,string不会自动更改,但我认为这是最干净的方法。

或者你可以将这个方法提取到一些策略对象。 在这种情况下,你可以很容易地testing提取的类,不要使方法公开或reflection/字节码一些魔术。

我不知道有任何这样的注释,但以下可能是有价值的: unit testing私有方法
或者以下: JMockit

你不能这样做,那么你甚至可以编译你的testing呢? 编译器不会将注释考虑在内。

这有两个一般的方法

首先是使用reflection来访问方法

第二个是使用package-private而不是private,然后在同一个包中(但在不同的模块中)进行testing。 他们基本上是私人的其他代码,但你的testing仍然能够访问它们。

当然,如果你做黑箱testing,你不应该访问私人会员。

我们最近发布了一个图书馆,通过reflection来访问私人领域,方法和内部类: BoundBox

对于像一个类

 public class Outer { private static class Inner { private int foo() {return 2;} } } 

它提供了如下语法:

 Outer outer = new Outer(); Object inner = BoundBoxOfOuter.boundBox_new_Inner(); new BoundBoxOfOuter.BoundBoxOfInner(inner).foo(); 

创buildBoundBox类必须做的唯一事情就是编写@BoundBox(boundClass=Outer.class)BoundBoxOfOuter类将被立即生成。

好的,在这里我们有两件事情正在混合。 首先,当你需要标记的东西只能用于testing,我同意@JB Nizet,使用番石榴的注释会是好的。

不同的是,testing私人方法。 为什么要从外面testing私有方法? 我的意思是,你应该能够通过他们的公共方法来testing这个对象,并且结束它的行为。 至less,我们正在做,并试图教给初级开发人员,总是试图testing私人方法(作为一个良好的做法)。

据我所知,没有像这样的注释。 最好的方法是像其他人所build议的那样使用reflection。 看这个post:
如何testing具有私有方法,字段或内部类的类?

你只应该注意testing方法的exception结果。 例如:如果你期望一个IllegalArgumentException,但是你会得到“null”(Class:java.lang.reflect.InvocationTargetException)。
我的一个coleguebuild议使用powermock框架来处理这些情况,但是我还没有testing过,所以不知道它到底能做什么。 虽然我使用了基于它的Mockito框架,也是一个很好的框架(但我认为不能解决私有方法exception问题)。

拥有@PublicForTests注解是个好主意。

干杯!

我只是通过把它作为一个内部类来进行testing: http : //www.ninthavenue.com.au/how-to-unit-test-private-methods