0

Spring MVC Webアプリケーション(現在、Java6およびSpring3.0.6)を開発しています。AbstractTransactionalJUnit4SpringContextTestsを拡張するJunit4を使用していくつかのSpring統合テストを書き始めています。これらは、MavenビルドまたはEclipseIDE(3.7)のいずれかで呼び出します。これらのテストは、Controllerメソッド(つまり、@ Controllerで注釈が付けられたクラスの@RequestHandlerで注釈が付けられたメソッド)を呼び出します。

コントローラにアスペクトベースのロギングを追加するまで、すべてが順調に進んでいました。

    // public controller methods
@Pointcut("execution(public * com.axiope.webapp.controller.*.*(..))")
private void publicControllerMethod() {
}
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
private void requestHandler(){}

@Pointcut("publicControllerMethod() && requestHandler() ")
private void controllerHandler(){}



// logs contoller exceptions
@AfterThrowing(
        pointcut="controllerHandler()",
        throwing="ex")
      public void logControllerExceptions(Throwable ex) {
    logger = LogFactory.getLog(ex.getClass());
    logger.error("Controller exception !" + ex.getMessage());   
    }

Mavenでテストを実行すると、次のようなエラーが発生します。

No unique bean of type [com.axiope.webapp.controller.StructuredDocumentController]
is defined: expected single bean but found 0: 

テストでは、setUpメソッドのapplicationContextからコントローラーをロードしています。

structuredDocumentController = applicationContext.getBean(
    StructuredDocumentController.class);

アスペクトをコメントアウトしても、このエラーは発生しません。Springがコントローラーをプロキシしていることに関係しているのではないかと思いますが、コントローラークラスはそのクラス名で識別できません。applicationContext.xmlでコントローラーをBeanとして宣言しようとしましたが、これは役に立ちません。この問題はEclipseでテストを実行するときにも発生するため、Maven構成では問題ありません。

私の質問は、テストでコントローラーBeanを検出するにはどうすればよいですか?

助けてくれて本当にありがたいです-コントローラークラスのメソッドにアスペクトを追加するのは間違っていますか?テスト時に何らかの方法でアスペクトを無効にする必要がありますか?(理想的には、統合テストでロギングが正しく機能していることを確認したいと思います)。

どうもありがとう

リチャード

4

1 に答える 1

0

アスペクトはおそらく問題ではありません。コントローラーでも問題なく使用できるはずです。

私の推測では、テストの正しいコンテキストをロードしていないと思います-このテストに使用するアプリケーションコンテキストをどのように指定しましたか-@ContextConfigurationテストクラスに場所があり、ルートコンテキスト(ContextLoaderListenerで指定されたもの)の場所です)またはWebアプリケーションコンテキスト(DispatcherServletを介して指定されたもの)。

于 2012-08-02T12:16:07.887 に答える