Java 9: ​​ServiceLoader не загружает реализацию теста из источников теста (модуль) - PullRequest
0 голосов
/ 08 января 2019

Я использую систему Java9 Module (работает на openjdk11)

У меня есть

  • мигрировал с Java8, и код содержал классы, которые использовали механизм ServiceLoader.
  • модульный тест для этого класса, который пытается загрузить две реализации службы тестирования

  • реализации теста перечислены в файле META-INF / services

src/main/example/Service.java

public interface Service {
  public static List<Service> loadServices(){
    return StreamSupport.stream(ServiceLoader.load(Service.class).spliterator(),false)                                       
                        .collect(Collectors.toList());
   }
}

и src/main/module-info.java

module example {
  uses example.Service;
  exports example;
}

и у меня есть такой тестовый модуль

src/main/example/ServiceTest.java

public ServiceTest {
  @Test
  void loadServices_should_find_TestServices{
    List<Service> services = Service.loadServices();
    assertEquals(2, services.size());
  }
}

и у меня есть две службы тестирования в источнике теста:

src/main/example/TestService1.java

public TestService1 implements Service {}

src/main/example/TestService2.java

public TestService2 implements Service {}

src/test/resources/META-INF/services/example.Service

example.TestService1
example.TestService2

Я использую плагин maven-surefire-3.0.0-M3 без какой-либо конкретной конфигурации

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>3.0.0-M3</version>
</plugin>

, который корректно исправляет пример модуля (из файла surefireargs)

--patch-module example="D:\\git\\example\\target\\test-classes"

Когда я выполняю тест непосредственно в IntelliJ, тест успешно запускается, обнаруживаются две службы. Тем не менее, когда я собираю модуль в maven, и тест выполняется безошибочно, он не находит сервисы и тест не пройден.

Как мне настроить верный запуск, чтобы найти TestServices, находящиеся в источниках тестирования? Я не могу определить объявление «обеспечивает ...» в информации модуля, поскольку они являются тестовыми сервисами. Что я делаю неправильно?

1 Ответ

0 голосов
/ 08 января 2019

Я нашел обходной путь, который я не считаю реальным решением проблемы: Отключение ModulePath по верному пути, возвращаясь к ClassPath:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <useModulePath>false</useModulePath>
  </configuration>
</plugin>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...