Java 弹簧靴&x2B;junit+;重写的组件实例

Java 弹簧靴&x2B;junit+;重写的组件实例,java,junit,spring-boot,Java,Junit,Spring Boot,我有一个样本项目。我想使用类com.github.bilak.axonframework.poc.command.user.UserTest设置som junit测试 当我运行测试时,我可以在日志中看到 跳过[BeanMethod:name=userCommandHandler,declaringClass=com.github.bilak.axonframework.poc.command.config.CommandConfiguration]的bean定义:bean“userCommand

我有一个样本项目。我想使用类
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实现,我可以看到它实际上将传递的实例包装到某个适配器中。此外,因为您传递的实际上是一个spring代理,它的userRepository直接引用为null(我认为这是正确的),所以有效的注册处理程序也将其设置为null,因此您可能会因此遇到null指针异常。如果我更改了测试的设置:

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

这很有帮助。

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

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

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

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

这很有帮助。

好吧,这对我来说很有用……但是当我在CommandConfiguration中重命名userCommandHandler时,它不应该起作用吗?当然,只有您需要使用限定符来决定将哪个限定符注入测试。这只解决了“跳过bean定义”警告,但代理问题是另一个问题。好吧,这对我来说是可行的…但是当我在CommandConfiguration中重命名userCommandHandler时,它不应该起作用吗?当然,只有您需要使用限定符来决定将哪个限定符注入测试。这只解决了跳过bean定义的警告,但是代理问题是另一个问题。