我有示例项目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类中使用的另一个实例。为什么要这样做,如何避免这种情况?
谢谢
最佳答案
这是因为名称userCommandHandler的bean在上下文中定义了两次。首先是在组件扫描中注册的带注释的组件com.github.bilak.axonframework.poc.command.user.UserCommandHandler
,其次是在CommandConfiguration中定义的bean(第75行)。
然后我可以看到,当将UserRepository注入UserCommandHandler时,这是UserTest类中使用的另一个实例。
通过查看GivenWhenThenTestFixture实现,我可以看到它实际上将传递的实例包装到了某些适配器中。而且,由于您传递的实际上是一个具有userRepository直接引用null(我相信是正确的)的spring代理,因此有效的注册处理程序也将其也设置为null,因此您可能因此而遇到null指针异常。如果我更改测试的设置:
@Before
public void setup() throws Exception {
fixture = Fixtures.newGivenWhenThenFixture(User.class);
UserCommandHandler target = (UserCommandHandler) ((Advised) userCommandHandler).getTargetSource().getTarget();
fixture.registerAnnotatedCommandHandler(target);
}
它有助于。
关于java - Spring Boot + JUnit +覆盖的组件实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31871171/