2

所以我正在尝试对现有代码进行一些集成测试,并且需要模拟一个私有方法返回。所以我想我会给 AspectJ LTW 一个尝试,并将 Around 建议编织到私有方法中,并让建议执行切入点忽略响应,然后发送我自己的响应。

我通过 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] 信息 AspectJ Weaver 版本 1.6.11 构建于 2011 年 3 月 15 日星期二格林威治标准时间 15:31:04 [junit] [AppClassLoader@12360be0] info register classloader sun.misc.Launcher$AppClassLoader@12360be0 [junit] [AppClassLoader@12360be0] info using configuration file:/C:/dev/EntSvc/workspaces/Default/Master/jars/org .springframework.aspects-3.0.5.RELEASE.jar!/META-INF/aop.xml [junit] [AppClassLoader@12360be0] info using configuration /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] 信息注册方面 org.springframework.transaction.aspectj.AnnotationTransactionAspect [junit] [AppClassLoader@12360be0] 信息注册方面 com.test.integrationtest.MockMethodReturnIntercepter [junit] [AppClassLoader @12360be0] 警告 javax.* 类型没有被编织,因为未指定编织器选项“-Xset:weaveJavaxPackages=true”* 未编织类型,因为未指定编织器选项“-Xset:weaveJavaxPackages=true”* 未编织类型,因为未指定编织器选项“-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 的第一个上下文文件

有人有什么想法吗?

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 回答