【问题标题】:How to test within the same module?如何在同一个模块内进行测试?
【发布时间】:2020-05-28 13:05:55
【问题描述】:

在这个项目中,我有一个模块化设置。有一个包含两个模块的父级。

这是来自 parent-pom.xml 的 sn-p:

<modules>
    <module>moduleA</module>
    <module>moduleB</module>
</modules>

两个模块都有一个module-info.java。这是 moduleB 的 module-info.java:

module moduleB {
    requires spring.web;
    requires static lombok;
    requires java.validation;
    requires swagger.annotations;
    requires slf4j.api;
    exports com.example.service
}

在 moduleB 中有 main 文件夹和 test 文件夹,就像任何常规的 java 项目一样。在 test-folder 中有一个 JUnit5 测试,它试图在同一个包中测试一个服务,但是在 src-folder 中。

在尝试此操作时,我收到以下错误消息:

module moduleB does not "opens com.example.service" to unnamed module @67205a84

据我了解,所有不属于模块的依赖项都将打包在一个“未命名”模块中。在这种情况下模块@67205a84。我希望在这个模块中出现的东西是 Mockito 之类的东西,我只用于测试。如果我对这个假设有误,请纠正我。

当我打开我的 moduleB(通过在 moduledecleration 之前添加单词“open”)时,测试运行顺利。但显然这不是我想要的。

所以我的问题真的是:我可以打开未命名的模块以便我的测试可以运行,但我的模块对于测试以外的任何东西都保持关闭状态?

这是目录结构的简化概述。

- parent
  |
  -> - pom.xml
     - moduleA
     - moduleB
       |
       -> - pom.xml
          - src
            |
            -> - main
                 |
                 -> - java
                      |
                      -> - module.info
                         - com.example.service
                           |
                           -> - ModuleBService.java
               - test
                 | 
                 -> - java
                      | 
                      -> - com.example
                           |
                           -> - Application.java
                         - com.example.service
                           | 
                           -> - ModuleBServiceTest.java

事实证明,Application.class 的位置是相关的。我要测试的模块没有使用@SpringbootApplication 注释的类,因为它只是一个库。为了测试它的功能,我必须在测试中启动一个 SpringbootApplication。当 Application.java 与 ModuleBServiceTest.java 在同一个包中时,一切都很好。当我将它移出另一个包时,会出现上面的错误消息。这是为什么呢?

【问题讨论】:

    标签: java junit5 java-module


    【解决方案1】:

    您可以做的是配置surefire插件以将模块打开到moduleB的POM中的未命名模块

    <build>
      <plugins>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
            <argLine>
              <!-- Allow access to the tests during test time -->
              --add-opens moduleB/com.example.service=ALL-UNNAMED
              <!-- Add export to test-util classes to moduleC if it wants to reuse these -->
              --add-exports moduleB/com.example.service.test.util=moduleC
              <!-- Prevent any illegal access to modules -->
              --illegal-access=deny
            </argLine>
          </configuration>
        </plugin>
      </plugins>
    </build>
    

    我还添加了一个示例,您可以在其中显式导出一些测试实用程序类到另一个模块,以防它想要访问这些

    事实证明,Application.class 的位置是相关的。我要测试的模块没有使用@SpringbootApplication 注释的类,因为它只是一个库。为了测试它的功能,我必须在测试中启动一个 SpringbootApplication。当 Application.java 与 ModuleBServiceTest.java 在同一个包中时,一切都很好。当我将它移出另一个包时,会出现上面的错误消息。这是为什么呢?

    AFAIK Spring Boot 将扫描其包和任何子包中的组件、服务等,并将这些自动添加到其配置中。如果应用程序不直接位于祖先路径中,它可能无法找到您的测试类,尽管提供的信息有些有限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多