Java Spring如何模拟实现相同接口的bean



我有一个bean,它是按照创建的

@Profile({"test", "dev", "int"})
@Bean
public CustomerEmailSenderImpl customerEmailSenderImpl(){
return new CustomerEmailSenderImpl ();
}

在一个测试课上,我嘲笑这个班如下:

@ActiveProfiles(profiles = {"test"})
.....
@MockBean
private CustomerEmailSenderImpl customerEmailSenderImpl;

现在。我必须创建第二个电子邮件类,该类必须在使用profile"时专门使用;测试";。因此,我创建了一个接口(CustomerEmailSender(,这两个类都实现了该接口。bean的创建过程如下。

@Profile({"dev", "int"})
@Bean(name = "customerEmailSender")
public CustomerEmailSender customerEmailSenderImpl1(){
return new CustomerEmailSenderImpl1 ();
}
@Profile({"test"})
@Bean(name = "customerEmailSender")
public CustomerEmailSender customerEmailSenderImpl2(){
return new CustomerEmailSenderImpl2 ();
}

Mock我改了一个跟随

@ActiveProfiles(profiles = {"test"})
...
@MockBean
private CustomerEmailSender customerEmailSender;

应用程序启动时没有出现错误。但是该测试并没有模拟bean CustomerEmailSenderImpl2。bean总是被实例化,并且实际的代码被执行。即使在测试类中从Interface更改为类名也无济于事:

@MockBean
private CustomerEmailSenderImpl2 customerEmailSenderImpl2;

需要什么来模拟bean CustomerEmailSenderImpl2?

解决方案是使用@Qualifier,然后在测试类中使用限定符名称作为变量名称。

@Profile({"test"})
@Bean(name = "customerEmailSender")
@Qualifier(value="customerEmailSenderImpl2")
public CustomerEmailSender customerEmailSenderImpl2(){
return new CustomerEmailSenderImpl2 ();
}

@MockBean
private CustomerEmailSender customerEmailSenderImpl2;

最新更新