我有示例项目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/

10-09 12:29