当前位置: 首页 > 知识库问答 >
问题:

带有Aspectj的Spring加载时编织,集成测试中不执行方面

韩飞翮
2023-03-14

我通过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]信息[main](DefaultContextLoadTimeWeaver.java:73)-找到Spring的JVM instrumentation代理[junit][AppClassLoader@12360BE0]信息AspectJ Weaver版本1.6.11于2011年3月15日星期二15:31:04 GMT构建[junit][AppClassLoader@12360BE0]信息注册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]使用配置的信息/c:/dev/entsvc/workspaces/default/monitors/test/resources/meta-inf/aop.xml[junit][AppClassLoader@12360be0]信息注册方面org.springframework.beans.factor.AspectJ.annotationbeanconfigureraspect[junit][AppClassLoader@12360be0]信息注册方面org.springframework.scheduling.AspectJ.annotationbeanconfigureraspect[AppClassLoader@12360be0]信息注册方面Aspect[junit][AppClassLoader@12360BE0]info register Aspect com.test.integrationtest.mockMethodReturnIntercepter[junit][AppClassLoader@12360BE0]警告javax.*未编织类型,因为未指定编织器选项“-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/>

加载到类PathXmlApplicationContext中的第一个上下文文件

有人有什么想法吗?

共有1个答案

堵毅然
2023-03-14

好吧,多亏了加上

            <!--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实际上也需要对方面进行编织,以便能够访问它。在将MockMethodRedRurnIntercepter的包添加到Weaver之前,我一直在获取方法aspectOf()的MethodNotFound异常。

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

这样做后一切都很好。显然这是Spring3.x的新内容http://forum.springsource.org/showthread.php?101447-aspect-is-not-being-call-while-testing-with-junit

 类似资料:
  • 如果我使用的是基于AspectJ的Spring AOP,那么我是否需要配置我的方面来使用加载时间编织?或者Spring AOP在使用基于AspectJ的方法时也支持运行时/编译时编织吗?

  • 当我设置Spring Ashej加载时间编织并通过关键字创建一个实例时,如下所示(下图)。事实证明,我无法访问构造函数中的依赖项。正如预期的那样,这一切都很好。执行顺序是 。现在,我可以访问构造函数中的依赖项。但问题是执行顺序:

  • 阅读文档(链接)时,我很难理解这些段落(可能也是因为英语不是我的母语)。 首先,我读 此外,在某些环境中,这种支持允许加载时编织,而不需要对应用程序服务器的启动脚本进行任何修改,以添加或(如我们在本节后面所述)(以前命名为)。 而且 哪些档案?类和文件? 然后,在同一子章中描述一个例子时,他们说 我们还有最后一件事要做。本节的介绍确实说过,可以在Spring的每个基础上有选择地打开LTW,这是事实

  • 我构建了一个应用程序来测试围绕类注入日志信息(进入和退出)。我使用Spring构建了它,并使用以下示例构建它。 http://static.springsource.org/spring/docs/2.5.5/reference/aop.html#aop-aj ltw公司 它现在工作得很好,但我有2个问题: 当日志围绕方法编织时,不包括私有方法。在Spring的xml设置中是否有允许编织私有方法的

  • 由于某种原因,当我单独使用@ComponentScan时,我的DAO没有加载。 我的道: 我的配置类(用嵌入的数据库覆盖数据源bean): 我的测试课: 我的理解是@ComponentScan应该能够找到MyDAO并加载它(TestConfig类中的数据源加载得很好)。但是,没有加载MyDAO。我得到了“org.springframework.beans.factory.NoSuchBeanDef