所以我试图对现有代码进行一些集成测试,并需要模拟私有方法返回。 所以我想我会尝试使用AspectJ LTW并在私有方法的周围编写建议并让建议执行切入点忽略响应,然后发送我自己的响应。
我通过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] info AspectJ Weaver Version 1.6.11建于2011年3月15日星期二格林威治标准时间15:31:04 [junit] [AppClassLoader @ 12360be0] info register classloader sun.misc.Launcher$AppClassLoader@12360be0 [junit] [AppClassLoader @ 12360be0]使用配置文件的信息:/ C:/dev/EntSvc/workspaces/Default/Master/jars/org.springframework.aspects-3.0.5.RELEASE.jar!/ META-INF / aop。 XML [junit] [AppClassLoader @ 12360be0] info使用配置/C:/dev/EntSvc/workspaces/Default/Monitors/test/resources/META-INF/aop.xml [junit] [AppClassLoader @ 12360be0] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect [junit] [AppClassLoader @ 12360be0] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect [junit] [AppClassLoader @ 12360be0] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect [junit] [AppClassLoader @ 12360be0] info register aspect com.test.integrationtest.MockMethodReturnIntercepter [junit] [AppClassLoader @ 12360be0]警告javax。*类型没有被编织,因为没有指定weaver选项'-Xset:weaveJavaxPackages = true'
但是在执行过程中似乎没有任何结果,因为我看不到记录或来自我的Aspect的结果
@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
中有人有什么想法吗?
答案 0 :(得分: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进行编织以便它可以访问它。我正在为方法aspectOf()获取MethodNotFound异常,直到我将MockMethodReturnIntercepter的包添加到织工。
<include within="com.test.integrationtest.*" />
这样做之后一切都很好。显然这是Spring 3.x的新功能 http://forum.springsource.org/showthread.php?101447-Aspect-is-not-being-called-while-testing-with-JUnit