【问题标题】:Overriding src clases with test classes for java unit testing用测试类覆盖 src 类以进行 java 单元测试
【发布时间】:2016-11-14 09:23:14
【问题描述】:

我正在尝试了解 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 decleration 开头)。 ObjectPrinter.java(在测试时由ObjectPrinterTest.java 调用)将具有import XXX.MyObject 声明。

如何在测试时import XXX.MyObject 将导入test/java/MyObject.java 而“生产”调用将调用src/java/MyObject.java?。
这种目录构建安全吗?是常用的用法吗?
我在哪里可以阅读有关此特定流程的更多信息?

谢谢!

【问题讨论】:

    标签: java unit-testing junit


    【解决方案1】:

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

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

    如果你想保留 MyObject 的大部分逻辑但覆盖其中的一些,你应该在 src/test/java 中创建一个stub class,即。我的对象存根。

    另一种替换测试逻辑逻辑的方法是使用模拟库,例如Mockito

    【讨论】:

    • 谢谢,正是我正在寻找的答案。一个小的后续问题 - 是 src/test 目录即使是项目依赖项的第一个类查找(即,如果 MyObject 不在同一个项目中/dependency 作为测试类,但在同时具有 src/MyObject 和 test/MyObject 的并行项目中)。它是否总是首先在测试文件夹中查找,然后才转到 src 文件夹,而不管与原始项目的“距离”如何?)。换句话说——单元测试运行是否总是首先寻找 src/test,而“生产”运行总是寻找“src/main”——不管它们是否在任何 jar/依赖路径中?
    • src/test 不会从任何其他项目中看到,因此这些类/资源不存在在生产代码中使用的风险。如果外部项目依赖于您的项目,它们也将永远不会被看到。只要您的单元测试位于 src/test(它们应该是)中,它们就会始终优先考虑 src/test 中的资源。
    猜你喜欢
    • 2021-07-18
    • 2019-05-11
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多