我有示例项目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类中使用的那样。为什么要这样做?如何避免这种情况?
由于
答案 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);
}
有帮助。