8

私は困惑しています。AspectJ クラスをテストしようとしています。アプリケーションを実行しているときに、Aspect クラスが完全に取得されます。ただし、テスト内のメソッドをインターセプトする Aspect クラスを取得できないようです。

Spring 3.2.2、AspectJ 1.7.2、および Maven 4 を使用しています。

ここに私が取り組んでいる簡単なテストがあります:

AspectJ クラスのテスト

package my.package.path.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect
public class TestAOP {
    private String message;

    public TestAOP() {
    }

    @Pointcut("execution(* my.package.path.TestAOPClient.relayMessage(..))")
    public void aopPointcut() {
    }

    @Around("aopPointcut()")
    public String monitor(ProceedingJoinPoint pjp) throws Throwable {
        String msg = (String)pjp.proceed();
        this.setMessage(msg);
        return msg;
    }

}

メソッドがインターセプトされているクラス

package my.package.path.config;

public class TestAOPClient {
    public String relayMessage(String msg) {
        return msg;
    }
}

テストクラス

package my.package.path.config;

import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

@Configuration
@ContextConfiguration(classes={WebConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/java")
public class AopConfigTest extends AbstractJUnit4SpringContextTests {

     @Bean
     public TestAOP testAop() throws Exception {
        return new TestAOP();
     }

     @Test
     public void assertTestConfigIsActive() {
        TestAOPClient client = new TestAOPClient();
        client.relayMessage("hello");
        assertThat(((TestAOP)applicationContext.getBean("testAop")).getMessage(), equalTo("hello"));

    }
}

WebConfig ファイル

package my.package.path.web.context;
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass=false)
@ComponentScan(value={"my.package.path.config", "my.package.path.web"})
public class WebConfig {

}

常に、アサーションエラーが発生します

 Expected: "hello" but: was null

アスペクト ポイントカットに存在しないクラスを指定すると、実行時に ApplicationContext failed to load エラーが発生するため、WebApplicationContext が選択されているようです。

私は何が欠けていますか?

4

2 に答える 2

1

ポイントカット構成が間違っています (パッケージは、テスト クライアントと一致するように my.package.path.config にする必要があります)

@Pointcut("execution(* my.package.path.TestAOPClient.relayMessage(..))")

そしてあなたのクライアントは

package my.package.path.config;

public class TestAOPClient {
...

これに変更

@Pointcut("execution(* my.package.path.config.TestAOPClient.relayMessage(..))")

動作するはずです。

于 2013-06-07T09:01:39.673 に答える