AspectJ не ткацкий при тест-компиляции, а ткацкий при компиляции.Поэтому модульные тесты выдают ClassNotFoundException при работе с maven - PullRequest
2 голосов
/ 07 июля 2011

Все мои тесты junit проходили в eclipse, но при запуске из консоли они, похоже, выдают ClassNotFoundException для класса AJ RiskLogAspect.aj. Я могу убедиться, что в eclipse это правильно ткачество и обеспечивает необходимую функциональность.

Я попытался добавить зависимости в свой проект, чтобы убедиться, что все правильно.

Я начал добавлять аспектj-maven-plugin

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>compile</goal>
                    <goal>test-compile</goal>
                </goals>
            <phase>process-sources</phase>
                <configuration>
                    <showWeaveInfo>true</showWeaveInfo>
                    <encoding>UTF8</encoding>
                    <source>1.6</source>
                    <target>1.6</target>
                    <aspects>
                        <includes>
                            <include>com.idna.riskprofile.RiskLogAspect</include>
                        </includes>
                    </aspects>
                </configuration>
            </execution>
        </executions>
    </plugin>

Затем я добавил следующие зависимости

      <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.7</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.7</version>
    </dependency>

Есть идеи, что не так?

Я использую maven 2.0.9, а также jdK 1.6 update 21

После изменения некоторых настроек, которые я заметил в консоли, я получаю следующее "[Xlint: adviceDidNotMatch]" Похоже, что он выбирает мой класс, но неправильно применяет pointcut.

Для целевой компиляции он находит файл AJ и правильно применяет рекомендации, для целей компиляции тестов он говорит Xlint: adviceDidNotMatch и выдает исключение для класса, найденного для половины тестов junit. С консоли:

[INFO] [aspectj:compile {execution: default}]
[INFO] Join point 'method-execution(java.lang.String com.idna.riskprofile.impl.RiskProfileEntryPointImpl.execute(com.idna.riskprofile.domain.RiskProfileRequest))' in Type 'com.idna.riskprofile.impl.RiskProfileEntryPointImpl' (RiskProfileEntryPointImpl.java:35) advised by around advice from 'com.idna.riskprofile.logging.aspects.RiskLogAspect' (RiskLogAspect.aj:35)
[INFO] [aspectj:test-compile {execution: default}]
[WARNING] advice defined in com.idna.riskprofile.logging.aspects.RiskLogAspect has not been applied [Xlint:adviceDidNotMatch]
[INFO] [resources:resources]

Обновлено: похоже, что неуместные рекомендации по поводу цели тестовой компиляции были не причиной неудачных тестов на консоли, а другой проблемой конфигурации Spring.

1 Ответ

2 голосов
/ 07 июля 2011

Регистрация плагина aspectj недостаточна, вам также необходимо зарегистрировать некоторые цели:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.3.1</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <!-- use this goal to weave all your main classes -->
                <goal>test-compile</goal>
                <!-- use this goal to weave all your test classes -->
            </goals>
        </execution>
    </executions>
</plugin>
...