2

そのため、既存のコードの統合テストを実行しようとしており、プライベートメソッドの戻り値をモックアウトする必要があります。だから私はAspectJLTWを試してみて、プライベートメソッドへのアラウンドアドバイスを織り込み、アドバイスにポイントカットを実行させて応答を無視し、自分の応答を送信することにしました。

これをjUnitテストで実行します。javaagentを渡すことができるように、実行をフォークしています。

    <target name="test-integration" depends="compile-test">
    <echo message="========================================" />
    <echo message=" Executing target test-integration" />
    <echo message="========================================" />
    <delete dir="${test.report.dir}" failonerror="false" />
    <mkdir dir="${test.report.dir}" />
    <junit printsummary="yes" fork="yes" haltonfailure="yes" haltonerror="yes" showoutput="yes" >
        <jvmarg value="-javaagent:${spring.instrument.jar}" />
        <classpath>
            <pathelement location="${classes.test.dir}" />
            <pathelement location="${classes.dir}" />
            <path refid="test.run.classpath" />
            <path refid="compile.classpath" />
            <pathelement location="${test.resources}" />
        </classpath>
        <formatter type="plain" />
        <batchtest fork="yes" todir="${test.report.dir}">
            <fileset dir="${classes.test.dir}">
                <include name="com/test/integrationtest/*IntegrationTest*" />
                <exclude name="**/*$*" />
            </fileset>
        </batchtest>
    </junit>
</target>

そして、aop.xmlファイルを設定しました

<aspectj>
<weaver options="-verbose">
    <include within="com.services.*" />
    <dump within="com.services.*"/>
</weaver>
<aspects>
    <aspect
        name="com.test.integrationtest.MockMethodReturnIntercepter" />
</aspects>

そして、生成されたログにより、すべてが順調に進んでいるように見えます。

[junit] INFO [main](DefaultContextLoadTimeWeaver.java:73)-インストルメンテーション用のSpringのJVMエージェントが見つかりました[junit] [AppClassLoader@12360be0] infoAspectJWeaverバージョン1.6.11は2011年3月15日火曜日15:31:04GMTにビルドされました[junit] [AppClassLoader @ 12360be0] info register classloader sun.misc.Launcher $ AppClassLoader @ 12360be0 [junit] [AppClassLoader @ 12360be0]構成ファイルを使用した情報:/ C:/ dev / EntSvc / jobsspaces / Default / Master / jars / org .springframework.aspects-3.0.5.RELEASE.jar!/META-INF/aop.xml [junit] [AppClassLoader@12360be0]構成を使用した情報/C:/ dev / EntSvc / worksheets / Default / Monitors / test / resources / META-INF / aop.xml[junit][AppClassLoader@12360be0]情報レジスタアスペクトorg.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect[junit][AppClassLoader@12360be0]情報レジスタアスペクト組織。springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect [junit][AppClassLoader@12360be0]infoレジスタアスペクトorg.springframework.transaction.aspectj.AnnotationTransactionAspect[junit][AppClassLoader@12360be0]infoレジスタアスペクトcom.test.integrationtest.MockMethodReturnIntercepter[junit] @ 12360be0]警告javax。*タイプは、ウィーバーオプション'-Xset:weaveJavaxPackages = true'が指定されていないため、織り込まれていません*ウィーバーオプション'-Xset:weaveJavaxPackages = true'が指定されていないため、タイプはウィービングされていません*ウィーバーオプション'-Xset:weaveJavaxPackages = true'が指定されていないため、タイプはウィービングされていません

しかし、ログやアスペクトからの結果が表示されないため、実行中には何も起こらないようです。

@Aspect
public class MockMethodReturnIntercepter
{
    private final Log log = LogFactory.getLog(getClass());
private Object    returnVal;

@Around("methodsToMockReturn()")
public Object mockMethodReturn(ProceedingJoinPoint pjp) throws Throwable
{
    log.info("mockMethodReturn(ProceedingJoinPoint pjp)");
    // Go ahead and let it do whatever it was trying to do but just modify the return value
    pjp.proceed();
    log.info("mockMethodReturn(ProceedingJoinPoint pjp) RETURNING:" + returnVal);
    return "QM_H3385R1";
}

public Object getReturnVal()
{
    return returnVal;
}

public void setReturnVal(Object returnVal)
{
    this.returnVal = returnVal;
}

@Pointcut("execution(private * com.services.common.integration.MessageSenderDaoImpl.*(..))")
public void methodsToMockReturn()
{
}

}

ご覧のとおり、私はアドバイスを織り込む特定のクラスを選択し、応答をモックするためにそのプライベートメソッドを選択しています。

そして最後になりましたが、私は追加しました

<context:load-time-weaver/>

ClassPathXmlApplicationContextにロードされている最初のコンテキストファイルへ

誰か考えがありますか?

4

1 に答える 1

2

追加してくれてありがとう

            <!--jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true" />
        <jvmarg value="-Daj.weaving.verbose=true" />
        <jvmarg value="-Dorg.aspectj.tracing.enabled=true" />
        <jvmarg value="-Dorg.aspectj.tracing.factory=default" /-->

ant junit 構成に加えて、aspectJ 構成をさらにログアウトするだけで機能していましたが、Spring は実際に Aspect を織り込んでアクセスできるようにする必要があるようです。MockMethodReturnIntercepterのパッケージをウィーバーに追加するまで、メソッドaspectOf()のMethodNotFound例外を取得していました。

<include within="com.test.integrationtest.*" />

これを行った後、すべてが良好です。どうやらこれはSpring 3.xの新しいものです http://forum.springsource.org/showthread.php?101447-Aspect-is-not-being-called-while-testing-with-JUnit

于 2012-09-26T15:04:17.853 に答える