用java单元测试的测试类覆盖src类



我正在尝试理解在测试时导入类的JUnit方式。
我注意到,创建一个与src类同名的模拟类和相同的包,将导致测试导入该类而不是真正的src类。
例如:

src/main/java/MyObject.java
src/main/java/ObjectPrinter.java
src/test/java/MyObject.java
src/test/java/ObjectPrinterTest.java

其中main/java/MyObject.javatest/java/MyObject.java声明相同的包(两个文件都以相同的package XXX声明开始)。ObjectPrinter.java(在测试时由ObjectPrinterTest.java调用)将具有import XXX.MyObject声明。

为什么在测试时import XXX.MyObject会导入test/java/MyObject.java,而"生产"调用会调用src/java/MyObject.java ?
这种建立通讯录安全吗?这是常用语吗?
我在哪里可以读到更多关于这个特定流程的信息?

谢谢!

这是Java依赖项工作的结果。当运行JUnit测试时,src/test/java目录被用作要运行的项目,src/main/java被视为依赖项。当java试图解析导入路径时,它不知道该路径是来自内部文件还是依赖项。因此,它将首先尝试在项目中解决它,然后查看依赖项。如果它在项目中找到匹配项,它将不再查找。以同样的方式,当运行'生产'代码时,src/main/java被用作主项目,而不依赖于src/test/java,因此它将始终获得MyObject的原始实现。

以这种方式覆盖类在技术上是安全的,但不是一个好的做法。如果使用原来的实现,会使人不清楚。

如果你想保留MyObject的大部分逻辑,但覆盖其中的一些,你应该在src/test/java中创建一个存根类。MyObjectStub .

另一种替换测试逻辑的方法是使用mock库,如Mockito。

最新更新