覆盖src与测试类进行java单元测试

时间:2016-11-14 09:23:15

标签: java unit-testing junit

我试图在测试时理解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.javatest/java/MyObject.java都声明了相同的包(两个文件都以相同的package XXX decleration开头)。 ObjectPrinter.java(在测试时由ObjectPrinterTest.java调用)将有import XXX.MyObject个等级。

如何在测试时间import XXX.MyObject导入test/java/MyObject.java和'制作'电话会拨打src/java/MyObject.java? 这种目录构建安全吗?这是常用吗?
我在哪里可以阅读有关此特定流程的更多信息

谢谢!

1 个答案:

答案 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