当前位置: 首页 > 知识库问答 >
问题:

Spring为什么@mockbean不能使用profile自动生成接口

包唯
2023-03-14

我有一个接口,有两个实现。使用哪个实现取决于环境(生产、开发、测试……)。因此,我使用Spring配置文件。我正在使用一个配置文件来实例化正确的实现。

@Configuration
public class BeanConfiguration {

    @Profile({"develop","test-unit"})
    @Bean(name = "customerEmailSender")
    public CustomerEmailSender emailSenderImpl_1(){
        return new EmailSenderImpl_1();
    }

    @Profile({"prod"})
    @Bean(name = "customerEmailSender")
    public CustomerEmailSender emailSenderImpl_2(){
        return new EmailSenderImpl_2();
    }
}

当Spring容器启动时(使用特定的概要文件),正确的bean就会被带入类中,所有的工作都很好。

@Component
public class CustomerEmailProcessor {

    @Autowire
    private CustomerEmailSender customerEmailSender;
    
    ...
}

我还有一个测试类,我想在其中autowire这个bean。我正在使用@mock进行自动化。在测试类中,配置文件被设置为“test-unit”。因此,我期待spring容器在config类中查找要实例化的正确bean。但这不会发生。相反,会引发异常:
由:java.lang.IllegalStateException引起:无法注册模拟bean....需要替换一个匹配bean,但找到了[customerEmailSender,emailSenderImpl_1,emailSenderImpl_2]

当使用@Autowire注释时,一切都很好。但当然,豆子不再被嘲笑了,这就是我需要的。

@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = {"test-unit"})
@Import(BeanConfiguration.class)
public class CustomerEmailResourceTest {

    @MockBean
    private CustomerEmailSender customerEmailSender;
    
}

我在config类中放置了一个断点,可以看到在测试类中使用@autowire时,正确的bean被实例化(在“return new EmailSenderImpl_1();”的行处中断)。使用@mock时,根本没有bean被实例化。Spring在“return new EmailSenderImpl_1();”的行处不中断

为什么Spring可以在使用@mock注释时找到正确的bean。

共有1个答案

雍俊远
2023-03-14

@Mock注释一定是Spring不使用配置类“BeanConfiguration.java”的原因。这毕竟让森斯。

 类似资料:
  • 在应用程序模型中:- 控制器:- 如果我通过id就可以了。为什么id不能自动生成?如何解决此问题? 更多代码: 应用程序.属性:- data.sql:-

  • 当我编写一些spring代码时,我使用了带有class和annotation-config的Spring4。我已经声明一个bean将接口实现为组件。我正在尝试制作另一个bean来依赖于它的接口时间。但它不起作用,因为spring抛出一个错误,在该名称中找不到bean。我想这可能是因为只靠和实体类的自动电线工作,但我不知道为什么它会这样设置?有人能解释为什么依赖注释不允许类型自动连接到接口吗? 简单

  • 问题内容: 为什么我们不能在Spring bean中自动装配静态实例变量。我知道有另一种方法可以实现这一目标,但只想知道为什么我们不能以以下方式做到这一点。 例如 问题答案: 因为使用静态字段会鼓励使用静态方法。静态方法是邪恶的。依赖项注入的主要目的是让容器为你创建对象并进行连接。而且,它使测试更加容易。 一旦开始使用静态方法,就不再需要创建对象的实例,并且测试变得更加困难。同样,你不能创建给定类

  • 问题内容: 为什么不自动生成?我在应用程序服务器上遇到了一个问题,该服务器显然正在缓存一个旧类。 问题答案: 不会自动生成serialversionuid,因为它很危险。设置serialversionuid时,表示类的两个版本在序列化方面兼容。 假设您有一个名为Foo的类,并且它 没有serialversionuid (默认值),并且将Foo的实例序列化为文件。稍后,您将一些新成员添加到Foo类。

  • 为什么我们不能在Springbean中自动连接静态实例变量呢。我知道还有另一种方法可以实现这一点,但我只是想知道为什么我们不能用下面的方法来实现。 e. g.