2017-03-05 20 views
0

看点看点测试 - 不能让各方面bean的属性的权值

@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运行LIB所以不需要@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)); 

    } 

} 

当运行上面的测试情况下,我得到以下输出:

Console log

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

+0

仅供参考,我已重新格式化您的问题,因为您使用的是引用而不是普通或粗体文本。我也照顾让你的内联图片可见。请学习StackOverflow语法。谢谢。 – kriegaex

+0

问题:要理解你想解释的内容有点困难。我特别被这句话困惑:“在AspectJ运行库lib下不需要'@EnableAspectJAutoProxy'注释”是什么意思?你使用LTW(加载时织入)和完整的AspectJ而不是Spring AOP? – kriegaex

+0

对不起。我无法解释,但现在我想说,我不需要使用@EnableAspectJAutoProxy注释来配置FilmCounterConfig类,因为我使用的是STC IDE,并且我在项目的类路径中配置了AspectRuntimeLibrary。我想说。 –

回答

0

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

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

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

+0

是的。你是正确的输出,通过这样做是在以下在testFilmCounter()和计数器= [email protected] filmNumber 1包含在? true then filmCount = 1 在countFilm(int filmNumber)和this = [email protected] –

+0

但是为什么会发生这种情况?这个例子来自Spring in Action第四版本,略有变化(仅以类的名义) –

+0

您忘记了另一个“轻微”的变化:使用AspectJ代替Spring AOP。尽管我一生中从未使用过Spring,但我知道你需要使用'@ EnableLoadTimeWeaving'或者''。也许你已经这么做了,我不知道。 [documentation](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-configure)也提到了类似于'。只需阅读手册并自行完成,或者切换回Spring AOP即可。 – kriegaex