Spring не автоматически подключает @Configurable при запуске интеграционного теста Dropwizard во время сборки maven

Я использую Spring @Configurable для автоматического подключения bean-компонента, созданного с помощью «new» в приложении Dropwizard. У меня есть интеграционный тест, который использует DropwizardAppRule для запуска приложения, и я использую аспект j-maven-plugin для плетения времени компиляции.

Когда я делаю сборку и запускаю интеграционный тест из IDEA, bean-компонент подключается, как и ожидалось, и тест проходит.

Когда я запускаю «mvn clean install», компонент НЕ подключается, и тест завершается с ошибкой NullPointerException.

Когда я запускаю «mvn clean install -DskipTests» и запускаю приложение, bean-компонент подключается правильно.

Мой вопрос: почему он не работает во время «чистой установки mvn»?

Aspectj-maven-plugin работает на этапе источников процессов, поэтому классы должны быть инструментированы до запуска интеграционных тестов:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.8</version>
    <configuration>
      <complianceLevel>1.8</complianceLevel>
      <source>1.8</source>
      <target>1.8</target>
      <aspectLibraries>
        <aspectLibrary>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
        </aspectLibrary>
      </aspectLibraries>
    </configuration>
    <executions>
      <execution>
        <phase>process-sources</phase>
        <goals>
          <goal>compile</goal>
          <goal>test-compile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Если я декомпилирую класс, я увижу, что он действительно инструментирован.

Если я поставлю точку останова в установщике @Autowired и запущу интеграционный тест из IDEA, я увижу, что класс подключается Spring.

Он вообще не ломается в установщике при запуске «mvn clean install».

Замена @Autowired на @Resource не помогает.

У меня есть класс конфигурации Spring с @EnableSpringConfigured. Мое лучшее предположение заключается в том, что DropwizardAppRule не использует правильную конфигурацию Spring, хотя другие компоненты Spring управляются правильно.

Любая помощь приветствуется. Спасибо.

изменить

Я также тестировал как уверенный огонь по умолчанию (maven 3.2.5), так и с помощью:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
</plugin>

person user2830040    schedule 21.09.2015    source источник


Ответы (1)


Я понял это, но для объяснения проблемы требуется немного больше контекста. @Configurable создавался в перечислении следующим образом:

public enum Day {
    MONDAY(new MyConfigurableObject()),
    ...
}

Модульные и интеграционные тесты выполнялись вместе, и модульные тесты создавали экземпляр перечисления до того, как был доступен контекст Spring. Поскольку перечисления существуют в статическом контексте, в интеграционном тесте затем использовалось несвязанное перечисление.

Решение состоит в том, чтобы разделить выполнение модульного и интеграционного тестов. Я сделал это с помощью плагина maven-failsafe следующим образом:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <excludes>
            <exclude>it/**</exclude>
        </excludes>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <includes>
            <include>it/**</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>
person user2830040    schedule 22.09.2015