在Swift中,为了测试默认的访问级别类,可以将@testable
放在测试类头中,使内部访问级别类可以从测试包中访问和测试,而不会将类中的所有内容都公开。我想知道Java是否有办法达到同样的目的?
如何在测试包中测试Java中的默认访问级别类而不将类中的所有内容公开?
答案 0 :(得分:2)
在Java中,你唯一能做的就是让你的东西打包保护,如果你想从你的测试代码中使用它们(也就是说:如果你不希望它们被公开) 。
示例:我的课程经常看起来像
class Whatever
public Whatever() { this(new A(), new B()); };
Whatever(A a, B b) { ...
允许我使用第二个构造函数进行需要依赖注入的单元测试;并且同时依赖于生产代码应该总是使用公共构造函数的“约定”。
所以,即使我有不希望在我的包之外使用的类......我也会将构造函数公开表示:请使用这个。
这个想法基本上就是你的生产代码和测试代码位于同名的包中。
换句话说:Java没有提供访问仅来测试代码的好功能。
答案 1 :(得分:2)
在某些java库中有@VisibleForTesting注释,但通常它不会阻止非法访问。即使使软件包受到保护也无法解决所有问题,因为其他一些类仍然可以使用测试代码,这可能会导致一些意外行为。我最近偶然发现了一个很好的构造,它允许你展示关于暴露一些测试方法的意图
public class A{
private int someMethodYouWantToTest(){}
private Testability testability = new Testability();
class Testability{
int exposedMethodForTest(){
someMethodYouWantToTest()
}
}
}
然后在你的测试课
public class Test{
private A underTest = new A()
public void testHiddenMethod(){
a.testability.exposedMethodForTest()
}
}
这种方式,私有方法是私有的,只有通过专用的可测试性内部类才能访问,明确说明其目的,因此没有人在测试之外调用您的方法。这解决了包受保护的业务方法的问题,这些方法可以从其他地方调用,但实际上是私有的。
答案 2 :(得分:1)
“
您通常不直接对私有方法进行单元测试。既然他们是 私有,认为它们是一个实现细节。没有人会去 打电话给他们中的一个并期望它以特定方式工作。
您应该测试您的公共接口。如果方法那样 调用你的私有方法正如你所期望的那样工作,然后假设 通过扩展,您的私人方法正常工作。“
这相当于此link
中的选项1如果1不符合您的目标,您可以尝试链接中提到的方法2,3和4
答案 3 :(得分:1)
当然,必须使方法可见的方法是不完美的,否则这些方法将是私有的,即使它只在类自己的包中。
另一方面,无论如何推荐(并且有很多好处)不依赖于异常,而是依赖于接口。
这意味着:为客户端提供一个接口,该接口仅声明您要公开的方法,并使您必须在实现中测试的方法受到保护,并且不要将它们包含在接口中。