spring boot + junit + overriden组件实例

时间:2015-08-07 06:36:36

标签: java junit spring-boot

我有示例项目here。我想用课程com.github.bilak.axonframework.poc.command.user.UserTest设置som junit测试 当我运行测试时,我可以在日志中看到

  

[BeanMethod:name = userCommandHandler,declaringClass = com.github.bilak.axonframework.poc.command.config.CommandConfiguration]的跳过bean定义:bean“userCommandHandler”的定义已经存在。此顶级bean定义被视为覆盖。

然后我可以看到,当UserRepository注入UserCommandHandler时,这是另一个实例,就像在UserTest类中使用的那样。为什么要这样做?如何避免这种情况?

由于

1 个答案:

答案 0 :(得分:0)

这是因为名称​​ userCommandHandler 的bean在上下文中定义了两次。首先作为带注释的组件com.github.bilak.axonframework.poc.command.user.UserCommandHandler在组件扫描中注册,其次是在 CommandConfiguration 中定义的bean(第75行)。

  

然后我可以看到,当UserRepository注入UserCommandHandler时,这是另一个在UserTest类中使用的实例。

查看 GivenWhenThenTestFixture 实现,我可以看到它实际上将传递的实例包装到某个适配器中。而且,因为你传递的实际上是一个弹出代理,其userRepository直接引用为null(我相信这是正确的),有效的注册处理程序也使它为null,因此你可能会遇到空指针异常。如果我更改了测试的setUp:

@Before
public void setup() throws Exception {
    fixture = Fixtures.newGivenWhenThenFixture(User.class);
    UserCommandHandler target = (UserCommandHandler) ((Advised) userCommandHandler).getTargetSource().getTarget();
    fixture.registerAnnotatedCommandHandler(target);
}

有帮助。