如何用间谍替换现有的 bean

问题描述

我正在使用 Mockito 来测试复制库,在测试中我正在模拟 DAO。但是,该库的构建方式会扫描所有可用的 DAO,因此我得到了多个 bean(模拟了一个而不是模拟了一个)。

我正在创建一个这样的豆子间谍:

@Bean
@Primary
@Autowired
public DAOBean daoBean (DAOBean dao){
    return Mockito.spy(dao);
}

我想知道是否有可能以某种方式放置我的模拟 bean 而不是现有的 bean 而不仅仅是创建一个新的

pom.xml:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.7.RELEASE</version>
    <scope>test</scope>
</dependency>
    <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>2.0.2-beta</version>
    <scope>test</scope>
</dependency>

解决方法

您应该在测试类中使用 @MockBean

MockBean 注释位于 spring-boot-test maven artifact 中。

您需要在 spring-boot-starter-test 中添加 spring-boot-testpom.xml 才能使用 MockBean

参考:MockBean

,

如果您想确保在测试期间没有创建原始 bean,您可以

  1. 使用 Spring 配置文件运行测试,例如使用 test@ActiveProfiles("test")
  2. @Profile("!test") 注释原始 bean
,

我不确定您为什么要在构造函数中模拟 DAO。

通常情况相反 - 您可以通过提供 DAO 作为 spy() 方法的参数来实例化真实对象的间谍。

class DAOTest {

    @Test
    void givenDao_whenDoingSomething_thenOk() {
        DAOBean testBean = Mockito.spy(new DAOBean());
        // ... assertions ...
    }
}