【问题标题】:Aspect testing - can't get right value of aspects bean's property方面测试 - 无法获得方面 bean 属性的正确值
【发布时间】:2017-03-05 12:26:24
【问题描述】:

方面

@Configurable
@Aspect
public class FilmCounter {

    private Map<Integer, Integer> filmCounts = 
            new HashMap<Integer, Integer>();

    @Pointcut(
        "execution(* soundsystem.CompactDisc.play(int)) " +
        "&& args(filmNumber)" )
    public void filmPlayed(int filmNumber) {}

    @Before("filmPlayed(filmNumber)")
    public void countFilm(int filmNumber){      
        int currentCount = getPlayCount(filmNumber);
        filmCounts.put(filmNumber, currentCount + 1);

        System.out.println("filmNumber " + filmNumber + " contains in ? " + filmCounts.containsKey(filmNumber) + " then filmCount = " + filmCounts.get(filmNumber));

    }

    public int getPlayCount(int filmNumber){
        //System.out.println("filmNumber " + filmNumber + " contains in ? " + filmCounts.containsKey(filmNumber) + "");

        return filmCounts.containsKey(filmNumber)
                ? filmCounts.get(filmNumber) : 0;

    }
}

配置类

在 AspectJ 运行时库下,因此不需要 @EnableAspectJAutoProxy 注释

@Configuration
public class FilmCounterConfig {

    @Bean
    public CompactDisc filmDisk(){
        FilmDisc cd = new FilmDisc();
        cd.setTitle("1981's Melody Films");
        cd.setArtist("Kishor Kumar");
        List<String> films = new ArrayList<String>();
        films.add("Sanam Teri Kasam");
        films.add("Akhari Rasta");
        films.add("Hum Apke Hai Koun");
        films.add("Dil Hain Ke Manata Nahi");
        films.add("Hum Sath Sath Hain");
        cd.setFilms(films);

        return cd;
    }   

    @Bean
    public FilmCounter filmCounter(){
        return new FilmCounter();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=FilmCounterConfig.class)
public class FilmCounterTest {

    @Rule
    public final SystemOutRule systemOutRule = new SystemOutRule().enableLog(); 

    @Autowired
    private CompactDisc cd;

    @Autowired
    private FilmCounter counter;

    @Test
    public void testFilmCounter(){

        cd.play(1); System.out.println("counter.getPlayCount(1) = " + counter.getPlayCount(1));
        cd.play(2);
        cd.play(3);
        cd.play(3);
        cd.play(3);
        cd.play(3);     

        /*assertEquals(1, counter.getPlayCount(1));
        assertEquals(1, counter.getPlayCount(2));
        assertEquals(4, counter.getPlayCount(3));
        */

        System.out.println("Film 1 = " + counter.getPlayCount(1));
        System.out.println("Film 2 = " + counter.getPlayCount(2));
        System.out.println("Film 3 = " + counter.getPlayCount(3));

    }

}

运行上述测试用例时,我得到以下输出:

图像显示第一个方法调用cd.play(2); 的控制台日志输出看起来正常,但在调用System.out.println("Film 1 = " + counter.getPlayCount(1)); 后显示错误结果(它应该显示“4”但显示“0”)。

【问题讨论】:

  • 仅供参考,我已重新格式化您的问题,因为您使用引号而不是普通或粗体文本。我还负责使您的内联图片可见。请学习 StackOverflow 语法。谢谢。
  • 问题:您想解释的内容有点难以理解。我对这句话特别困惑:“在 AspectJ 运行时库下所以不需要@EnableAspectJAutoProxy 注释”是什么意思?您使用 LTW(加载时编织)和完整的 AspectJ 而不是 Spring AOP?
  • 对不起。我无法解释,但现在我想说我不需要使用 @EnableAspectJAutoProxy 注释来配置 FilmCounterConfig 类,因为我使用的是 STC IDE,并且我已经在项目的类路径中配置了 AspectRuntimeLibrary。我想说的。

标签: spring aspectj spring-aop


【解决方案1】:

我想我知道发生了什么,查看您的控制台日志:有一个活动方面实例记录您的方法调用,但可能与连接到您的测试中的不同。这可以解释方面日志输出与测试日志输出之间的差异。

如果您将System.out.println(this); 添加到countFilm(int) 建议并将System.out.println(counter); 添加到测试用例,我猜您可能会看到两个不同的对象ID。

如果我是对的,那么你的 bean 接线有问题。请在评论中提供反馈。

【讨论】:

  • 是的。你是对的,这样做的输出如下在 testFilmCounter() 和 counter = soundsystem.FilmCounter@762efe5d filmNumber 1 中包含? true then filmCount = 1 在 countFilm(int filmNumber) 和 this = soundsystem.FilmCounter@5d22bbb7
  • 但是为什么会这样呢?此示例来自 Spring in Action 第 4 版图书,略有更改(仅在类名称中)
  • 您忘记了另一个“轻微”变化:您使用 AspectJ 代替 Spring AOP。尽管我一生中从未使用过 Spring,但我知道您需要使用 @EnableLoadTimeWeaving&lt;context:load-time-weaver/&gt;。也许你已经这样做了,我不知道。 documentation 还提到了类似 &lt;bean id="my-aspect" class="com.xyz.MyAspect" factory-method="aspectOf"&gt; 的内容。只需阅读手册并自行解决,或者直接切换回 Spring AOP。
  • 我也试过这个'@EnableLoadTimeWeaving',但就像使用'@EnableAspectJAutoProxy'这也显示错误......[无法解析配置类[soundsystem.FilmCounterConfig];]
  • 我真的觉得你需要学一点Spring。如果无法解析配置类,那么显然存在一些语法错误,缺少导入或其他什么。我无法为你解决每一个小问题,尤其是因为我一生中从未使用过 Spring。我告诉你你的方面问题是什么,其余的你应该自己弄清楚 - 没有冒犯的意思。如果你找不到,我建议你重新开始,从本书的网站下载免费的源代码,然后重新尝试,而不是试图修复你搞砸的项目。
猜你喜欢
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多