我有一个返回私有类实例的方法,我需要从不同的包访问其方法以进行单元测试。这些类存在于同一个文件中。 它是这样的:
档案:A.java
public class A{
B b;
public B getB(){
return b;
}
public setB(B b){
this->b = b;
}
}
class B{
C c;
public C getC(){
return c;
}
public setC(C c){
this->c = c;
}
}
class C{
public int getInt(){
return 1;
}
}
所以...基本上问题是:B或C中的任何方法都能以某种方式到达吗?我是否有义务将B和C放在不同的文件中并将其公之于众?
答案 0 :(得分:1)
最佳做法是始终将每个顶级类的源代码放在单独的文件中。如果你不这样做,可能在编译等方面遇到困难
有一个单独的问题:类B
和C
是否需要public
,以便您可以创建单元测试。我想这可能是一个好主意,但有几种方法可以解决这个问题:
如果将单元测试放在与类A
,B
和C
相同的Java包中,那么类(及其方法)将显示为单元测试。
您可以通过创建public
和B
的{{1}}子类来公开这些方法,以用于测试目的。这些必须在与C
,A
和B
类相同的Java包中声明。
您可以创建C
和B
的实例,并使用反射调用方法。 (但这对于单元测试来说是很多工作,我不推荐它!)
请注意,如果您的产品代码和测试代码具有单独的源目录树,则可以将测试类放在与C
,A
和B
相同的包中,而无需混合代码库。在为生产/发布构建时,只需将测试树中的类保留在构建之外。
顺便说一句,在您的示例中,类C
和B
是“包私有”而不是“私有”。单元测试一个真正的“私人”类是一个完全不同的问题。
答案 1 :(得分:1)
您希望使用Reflection通过单元测试来测试私有方法。你可以在这里阅读更多内容(见答案):
How do I test a class that has private methods, fields or inner classes?
答案 2 :(得分:0)
是的,您可以使用反射在任何地方调用 B 或 C 的任何实例中的所有方法,但是,这来自我的POV,是一种黑客而不是一种技术。
否则, B 和 C 类不会在 A.class 之外公开。
答案 3 :(得分:0)
从技术上讲,课程受到保护;因此,只要调用getB和getC的类在同一个包中,就不会有任何问题。如果你试图运行GetB GetC的另一个软件包,你会看到一些问题,因为你的其他软件包将无法访问实际的类。
此处不能导入TestProt,因为它在tester2包中受到保护。 FILE1:
package tester;
import tester2.Test;
public class Testing {
public Testing() {
Test t = new Test();
TestProt p = t.prot();
}
}
FILE2:
package tester2;
public class Test {
public TestProt prot() {
return new TestProt();
}
}
class TestProt{
public TestProt() {
}
}