[英]public method returns private class instance in Java?
我有一个方法返回私有类的实例,我需要从不同的包访问其方法进行单元测试。 这些类存在于同一个文件中。 它是这样的:
档案: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放在不同的文件中并将其公之于众?
最佳做法是始终将每个顶级类的源代码放在单独的文件中。 如果你不这样做,你可能会遇到编译困难等问题。
还有一个问题是B
类和C
类是否需要public
以便您可以创建单元测试。 我想这可能是一个好主意,但有几种方法可以解决这个问题:
如果将单元测试放在与A
, B
和C
类相同的Java包中,则单元测试将显示类(及其方法)。
您可以通过创建B
和C
public
子类来公开方法以用于测试目的。 这些必须在与A
, B
和C
类相同的Java包中声明。
您可以使用反射创建B
和C
实例并在其上调用方法。 (但这对于单元测试来说是很多工作,我不推荐它!)
请注意,如果您的产品代码和测试代码具有单独的源目录树,则可以将测试类放入与A
, B
和C
相同的包中,而不会混淆代码库。 在为生产/发布构建时,只需将测试树中的类保留在构建之外。
顺便说一下,在你的例子中,类B
和C
是“包私有”而不是“私有”。 单元测试一个真正的“私人”类是一个完全不同的问题。
您希望使用Reflection来使用单元测试来测试私有方法。 你可以在这里阅读更多内容(见答案):
是的,您可以使用反射在任何地方调用B或C的任何实例中的所有方法,但是,从我的POV来看,这是一种黑客而不是技术。
否则, B类和C类不会暴露在A.class之外。
从技术上讲,课程受到保护; 因此,只要调用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() {
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.