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

尽管标记为@Primary,但Spring boot测试未在测试中使用重写bean

邹丰羽
2023-03-14

我们有一个bean公司处理器。在Spring引导集成测试中,当这个bean中的方法抛出异常时,我们想测试一个异常场景。

因此,我们创建了一个覆盖bean TestCompanyProcencer,它扩展了CompanyProcencer。TestCompanyProcencer标记为@主要。当我们只运行这个测试类时,测试运行正常,被覆盖的bean按预期使用。

但是这个测试类和其他几个测试类一起运行,每个测试类都标为@SpringBootTest,我们看到这个测试在第一个实例中失败了,因为它没有使用被覆盖的bean,而是使用了这个原始bean。我们有最多3次失败的自动重试。在第二次或第三次重试时,它以某种方式找到了正确的被覆盖的主bean,测试通过了。

有什么原因吗?为什么它会在第一个实例中找到原始bean,然后在与其他几个测试类一起运行时,在随后的重试中找到正确的重写bean。

被覆盖的bean定义如下。

@Primary
@Component
@ConditionalOnExpression("'${test.company.processor}' == 'true'")
class TestCompanyProcessor

在我们的测试课上

@TestPropertySource(properties = {"test.company.processor=true"})
class TestCompanyProcessorTest {

}

另外,我们在使用@Mockbean注释时也看到了同样的行为

共有1个答案

红朝
2023-03-14

如果您有多个共享相同上下文的Spring测试,您可能会看到这种行为。
Spring在测试之间缓存您的测试应用程序上下文。这是默认行为,因为实例化Spring上下文中的对象可能需要一些时间。

如果在不同的测试中有不同的bean,那么应该用@DirtiesContext注释标记更改ApplicationContext的测试(比如TestCompanyProcessorTest类)。

关于缓存的更多信息:
https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testing-ctx-management
DirtiesContext示例:
https://www.baeldung.com/spring-dirtiescontext

 类似资料:
  • 与@mockbean和@spybean一样,有没有类似于@fakebean/@dummybean的东西? 其思想是,该实例是100%真实的(具有预期的生产内部状态),并且它覆盖(或者添加bean,以防在配置中没有声明)上下文中的bean。理想情况下,您不需要创建TestConfiguration类并将其设置为Primary,因为这样可以在每个测试的基础上控制假冒,只有在需要时才可以。否则它使用主的

  • 我试图将测试用例导入到JIRA与Zephar Testcase导入器:我按照Zephar网站上的教程,这是我在日志中得到的消息: 2015年10月26日星期一16:23:58 CETfile:///Users/Sam/Downloads/AOTCDM10-地理标记。xlsx规范化成功。。!2015年10月26日星期一16:23:58 CET AOTCMD 10-地理标记。xlsx导入成功。。! 但

  • 我正在构建一个webapp,如果禁用Javascript,它将依赖于 标记。我想验证该标记所显示的内容,但我不确定如何使用我所拥有的任何框架或任何一般框架来实现这一点。 现在的测试,我使用噩梦和茉莉花测试。我不必使用这些,但如果可能的话,我仍然希望使用Javascript。 我在这里完全被难住了,甚至不知道从哪里开始--所有的StackOverflow问题似乎都是关于如何使用 ,而不是在端到端或单

  • 我最终做的是在测试设置过程中替换应用程序级图(MockRestAdapter就是在其中创建的

  • 最后是MockRestTemplateConfiguration

  • null 但他们都不为我工作。如果有人有这些包的工作例子,请指导。 还有其他过滤测试的方法吗?