在单元测试中覆盖一个自动装配的Bean

9 浏览
0 Comments

在单元测试中覆盖一个自动装配的Bean

在特定的单元测试中,我有没有简单的方法可以轻松地覆盖一个自动装配的bean?在编译类中,每种类型只有一个bean,所以自动装配不是问题。测试类中会包含额外的模拟对象。在运行单元测试时,我希望能够指定一个额外的配置,基本上是在运行这个单元测试时使用这个模拟对象,而不是标准的bean。\n对于我所需的内容,配置文件似乎有点过度,而且我不确定是否可以通过Primary注解来实现,因为不同的单元测试可能有不同的模拟对象。

0
0 Comments

在单元测试中覆盖自动装配的bean

我遇到了类似的问题,并且通过一种混合方法解决了它,我发现这种方法更有用和可重用。我为测试创建了一个spring配置文件,并且创建了一个配置类,以非常简单的方式覆盖我想要模拟的bean:

@Configuration("test")
(ApplicationConfiguration.class)
public class ConfigurationTests {
    private Producer kafkaProducer;
    private SlackNotifier slackNotifier;
}

通过这样做,我可以获取这些模拟的bean并使用mockito对它们进行验证。主要优点是现在所有的测试都可以无缝地获取模拟的bean,而不需要进行每个测试的更改。

已测试版本:

spring boot 1.4.2

0
0 Comments

在Spring Boot 1.4中,可以使用以下方法覆盖自动装配的bean:

(SpringRunner.class)
(classes = { MyApplication.class })
public class MyTests {
    private MyBeanClass myTestBean;
    public void setup() {
         ...
         when(myTestBean.doSomething()).thenReturn(someResult);
    }
    public void test() {
         // MyBeanClass bean is replaced with myTestBean in the ApplicationContext here
    }
}

其中,MyApplication是你的主应用程序类的名称,该类包含main()函数并带有注解。

如果要用Mockito模拟替换bean,这是最佳答案。否则(例如,如果要注入自定义对象),这并不起作用。

要使(MockitoTestExecutionListener.class)起作用,你需要使用某些其他的注释或配置。可以在文档中查找更多信息。

通过对以上内容进行整理,可以得出以下文章:

在单元测试中覆盖Autowired Bean的方法

在Spring Boot 1.4中,有一种简单的方法可以实现覆盖自动装配的bean。

(SpringRunner.class)
(classes = { MyApplication.class })
public class MyTests {
    private MyBeanClass myTestBean;
    public void setup() {
         ...
         when(myTestBean.doSomething()).thenReturn(someResult);
    }
    public void test() {
         // MyBeanClass bean is replaced with myTestBean in the ApplicationContext here
    }
}

其中,MyApplication是你的主应用程序类的名称,该类包含main()函数并带有注解。

如果要用Mockito模拟替换bean,这是最佳答案。否则(例如,如果要注入自定义对象),这并不起作用。

要使(MockitoTestExecutionListener.class)起作用,你需要使用某些其他的注释或配置。可以在文档中查找更多信息。

0
0 Comments

在单元测试中,有时我们希望提供一个不同的bean,来替代原有的bean。如果只是简单地想在测试中提供一个不同的bean,不需要使用spring profiles或者mockito。只需要按照以下步骤操作:

首先,在测试类上添加注解@(SpringJUnit4ClassRunner.class),并指定配置类(classes = { TestConfig.class })

然后,在测试类中定义一个静态内部类(TestConfig),该类扮演了替代原有bean的角色。在该类中,定义一个与原有bean相同的方法(myService),并返回一个新的实例(MockedMyService)

最后,在测试方法中可以使用新的bean实例进行测试。

需要注意的是,如果在使用Spring 4.1或者更早版本时,可能会遇到"bean已经存在"的问题。此时,需要将方法名修改为其他名称,例如(myServiceMock)。此外,建议使用@Primary注解来确保在TestConfig配置中定义的bean将替代Application配置中的bean。

另外,有读者提问@


注解是用来干什么的。这个注解只有在希望在测试配置中使用现有的bean时才需要使用。

还有一个读者问到为什么需要将TestConfig类定义为静态类。这是因为在JUnit测试中,测试类和测试方法是在不同的类加载器中运行的。如果不将TestConfig类定义为静态类,可能会导致无法访问到该类。

另外,有读者提到使用@Primary注解解决了Spring发现接口有多个实现的问题。这个注解确保了TestConfig配置中的bean将作为主要的bean。

还有一位读者在使用@


注解覆盖原有bean时遇到了问题。他使用的是spring-boot-starter-parent:2.0.0.RELEASE和spring-boot-starter-test:2.0.4.RELEASE版本。他通过使用@


注解解决了这个问题。

最后,还有一位读者表示这个解决方案在spring-boot-starter-parent:2.5.5版本中完美运行,不需要使用@


注解。他将TestConfig类保留为单独的类,以便可以在其他测试中导入和使用。

总结起来,以上是关于在单元测试中覆盖自动注入bean的一些解决方法。通过定义一个替代原有bean的静态内部类,并使用相同的方法名返回新的bean实例,可以实现对bean的覆盖。在一些特定情况下,可能需要使用@Primary注解或者@


注解来解决一些问题。最后,需要注意在不同版本的Spring中可能会有一些差异,需要根据具体情况进行调整。

0