首页 > 解决方案 > SpringBootTests 中的自动装配单例并不是真正的单例。这怎么可能,我应该如何处理?

问题描述

我在 main/java 下有一个 SpringBoot 应用程序,在 test/java 下进行了测试。一些测试用@SpringBootTest.

应用程序中的某些类具有对“Manager”对象的字段引用。该字段是自动装配的。它没有明确限定为原型,因此是单例。

当我运行测试时(我正在使用 gradle),我看到 Manager 对象在同一个过程中被实例化了两次,这让我感到惊讶。

对此的一种可能解释是,每个@SpringBootTest测试夹具代表一个作为测试运行的应用程序,因此对于每个测试夹具,Spring Boot 从头开始​​创建所需的所有依赖项。

这将是合理的行为,因为一个夹具中的任何测试都没有访问另一个夹具中的测试,因此出于所有意图和目的,单例合同似乎已得到履行。

然而,问题是所有的测试装置都是在同一个过程中实例化的。因此,在创建单例时完成的任何进程范围的工作都会为下一次测试留下副作用。

特别是,我的 Manager 单例将自定义 Appender 附加到 logback 根记录器。当第二个测试夹具中的测试运行时,每条日志消息都会发出两次。

假设这种行为是意料之中的,那么防止这种副作用的最佳做法是什么。如果不出所料,谁能告诉我在这个过程中我需要做些什么来保持自动连线的单身人士?

标签: javaspring-bootsingletonautowiredspring-boot-test

解决方案


推荐阅读