そのため、既存のコードの統合テストを実行しようとしており、プライベートメソッドの戻り値をモックアウトする必要があります。だから私は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にロードされている最初のコンテキストファイルへ
誰か考えがありますか?