Java JUnit测试公共方法对非公共字段的影响

Java JUnit测试公共方法对非公共字段的影响,java,junit,Java,Junit,包中有两个类a和B。每个a对象都有一个对B对象的引用。B实例的状态应该仅由a可见,这意味着所有B属性都具有包可见性。这是因为A类太复杂了——我把它一分为二,这样做在语义上是正确的 B类有一个公共方法副本,执行一种深度复制,这意味着某些属性被递归地深度复制,而对于某些属性,只复制引用 问题是我需要使用复制方法进行测试: 我可以调用复制方法 由于包的可见性,我无法对照原始对象的状态检查新创建对象的状态 我希望避免创建getter,因为B对象的状态不应该在包外部可见 是否有办法使B中的属性仅在测试时可

包中有两个类a和B。每个a对象都有一个对B对象的引用。B实例的状态应该仅由a可见,这意味着所有B属性都具有包可见性。这是因为A类太复杂了——我把它一分为二,这样做在语义上是正确的

B类有一个公共方法副本,执行一种深度复制,这意味着某些属性被递归地深度复制,而对于某些属性,只复制引用

问题是我需要使用复制方法进行测试:

我可以调用复制方法 由于包的可见性,我无法对照原始对象的状态检查新创建对象的状态 我希望避免创建getter,因为B对象的状态不应该在包外部可见 是否有办法使B中的属性仅在测试时可见

由于包的可见性,我无法对照原始对象的状态检查新创建对象的状态

那么您的测试设置就是错误的

Java单元测试的默认最佳实践是

类ProductionA由名为ProductionTest的类进行测试。。。更重要的是 ProductionA和ProductionTest都位于同一个包中 它们应该位于不同的目录中,但存在于同一个包中

因此,典型的maven项目结构如下所示:

project-root / src / main / java / my / com / package


当您遵循这种做法时,您在获取受包保护的字段和方法时不会遇到任何问题,这正是为什么每个人都以这种方式组织生产和测试类。

通常测试这些字段或方法的方法是包或默认可见性。因为当类a和B位于src/main/java中时,通常将测试类放在同一个包中的不同源文件夹中,如src/test/java。如果您使用此项目结构,您可以从测试类访问包或默认字段。这是公平的。有趣的是,项目使用了这种架构,但我的源文件夹是src,files类属于main.java.my.con.package和test.java.my.com.package,这引出了我的问题。答案中的关键是它们应该位于不同的目录中,但存在于同一个包中。谢谢你清晰详细的回答@AllirionX非常欢迎您,我感谢您的快速接受!
project-root / src / test / java / my / com / package