【问题标题】:How to replace existing bean with a spy如何用间谍替换现有的bean
【发布时间】:2021-02-25 07:56:33
【问题描述】:

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

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

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

我想知道是否有可能以某种方式放置我的模拟 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>

【问题讨论】:

    标签: java spring spring-mvc mockito replication


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      MockBean 注解位于spring-boot-test maven 工件中。

      您需要将spring-boot-starter-testspring-boot-test 添加到您的pom.xml 才能使用MockBean

      参考:MockBean

      【讨论】:

      • 不就是SpringBoot注解吗?我正在使用的项目仅使用 Spring-core,我无法更改它
      • 它在org.springframework.boot.test.mock.mockito 包中,可以在spring-boot-starter-test 工件中找到。如果你的依赖更新受限,你也应该显示你的项目的pom.xml
      • 如果我理解正确&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; 需要更多依赖项才能工作,我可以添加范围为测试的依赖项。我还将我的 pom.xml 添加到问题中
      • 是的。您需要将spring-boot-starter-testspring-boot-test 添加到pom.xml 才能使用MockBean 注释。我将更新答案以获取更多详细信息。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多