我试图在测试时理解JUnit导入类的方式
我注意到创建一个与src类名相同的mock类,并使用相同的包,将导致测试导入一个而不是真正的src类。
例如:
src/main/java/MyObject.java
src/main/java/ObjectPrinter.java
src/test/java/MyObject.java
src/test/java/ObjectPrinterTest.java
main/java/MyObject.java
和test/java/MyObject.java
都声明了相同的包(两个文件都以相同的package XXX
decleration开头)。
ObjectPrinter.java
(在测试时由ObjectPrinterTest.java
调用)将有import XXX.MyObject
个等级。
如何在测试时间import XXX.MyObject
导入test/java/MyObject.java
和'制作'电话会拨打src/java/MyObject.java
?
这种目录构建安全吗?这是常用吗?
我在哪里可以阅读有关此特定流程的更多信息
谢谢!
答案 0 :(得分:1)
这是Java依赖关系如何工作的结果。运行JUnit测试时,src / test / java目录用作要运行的项目,src / main / java被视为依赖项。当java尝试解析导入路径时,它不知道该路径是来自内部文件还是依赖项。因此,它将首先尝试在项目中解决它,然后查看依赖项。如果它在项目中找到匹配项,它将不再进一步查看。同样,当运行'生产'代码时,src / main / java被用作主项目而不依赖于src / test / java,因此它总是得到MyObject的原始实现。
以这种方式覆盖类在技术上是安全的,但不是一种好的做法。这将使得不清楚是否使用了原始实现。
如果你想保留MyObject的大部分逻辑但是要覆盖其中的一些,你应该在src / test / java中创建一个stub class,即。 MyObjectStub。
替换逻辑逻辑进行测试的另一种方法是使用模拟库,例如Mockito。