Как тестировать в одном модуле? - PullRequest
0 голосов
/ 28 мая 2020

В этом проекте у меня модульная установка. В нем есть родитель с двумя модулями.

Вот фрагмент родительского pom. xml:

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

Оба модуля имеют информацию о модуле. java. Вот информация о модуле. java для moduleB:

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

Внутри moduleB есть основная папка и тестовая папка, как и в любом обычном проекте java. В папке test есть тест JUnit5, который пытается протестировать службу в том же пакете, но в папке sr c.

Пытаясь это сделать, я получаю следующее сообщение об ошибке:

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

Как я понимаю, все зависимости, которые не являются частью модуля, будут упакованы в ' безымянный модуль. В данном случае модуль @ 67205a84. Я ожидаю увидеть в этом модуле такие вещи, как Mockito, который я использую только для тестирования. Пожалуйста, поправьте меня, если я ошибаюсь в этом предположении.

Когда я открываю свой модуль B (добавляя слово «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, все в порядке. Когда я перемещаю его в другой пакет, появляется сообщение об ошибке сверху. Почему?

1 Ответ

0 голосов
/ 29 мая 2020

Что вы можете сделать, так это настроить плагин surefire для открытия модуля для безымянных модулей в POM вашего moduleB

<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 просканирует свой пакет и любые подпакеты на наличие компонентов, служб и т.п. и автоматически добавит их в свою конфигурацию. Если приложение не находится непосредственно в пути к предку, оно может не найти ваш тестовый класс, хотя, если честно, предоставленная информация немного ограничена.

...