spring 启动 - 集成测试自动装配接口未找到此类 bean
spring boot - integration test autowired interface no such bean found
我有一个 spring-boot 应用程序,现在需要支持多个对象存储并根据环境有选择地使用所需的存储。基本上我所做的是创建一个接口,每个存储库然后实现该接口。
我已经简化了示例的代码。
我根据确定环境的 spring 配置文件为每种商店类型创建了 2 个 bean:
@Profile("env1")
@Bean
public store1Sdk buildClientStore1() {
return new store1sdk();
}
@Profile("env2")
@Bean
public store2Sdk buildClientStore2() {
return new store2sdk();
}
在服务层中,我已经自动连接了接口,然后在存储库中,我使用了@Profile 来指定要使用的接口实例。
public interface ObjectStore {
String download(String fileObjectKey);
...
}
@Service
public class ObjectHandlerService {
@Autowired
private ObjectStore objectStore;
public String getObject(String fileObjectKey) {
return objectStore.download(fileObjectKey);
}
...
}
@Repository
@Profile("env1")
public class Store1Repository implements ObjectStore {
@Autowired
private Store1Sdk store1client;
public String download(String fileObjectKey) {
return store1client.getObject(storeName, fileObjectKey);
}
}
当我使用配置的“env”启动应用程序时,它实际上按预期运行。然而,当 运行 测试时,我得到“没有符合条件的 ObjectStore 类型的 bean。预计至少有 1 个符合自动装配候选资格的 bean。”
@ExtendWith({ SpringExtension.class })
@SpringBootTest(classes = Application.class)
@ActiveProfiles("env1,test")
public class ComposerServiceTest {
@Autowired
private ObjectHandlerService service;
@Test
void download_success() {
String response = service.getObject("testKey");
...
}
}
如测试中的@ActiveProfile 所述class 还有一些其他环境,例如开发、测试、生产。我试过使用组件扫描,在同一个包中使用 impl 和 interface 等,但没有成功。我觉得我在测试设置中遗漏了一些明显的东西。但是可能与我的整体应用程序配置有关?我的解决方案的主要目的是避免出现
的长线
if (store1Sdk != null) {
store1Sdk.download(fileObjectKey);
}
if (store2Sdk != null) {
store2Sdk.download(fileObjectKey);
}
这个问题是因为 Store1Repository 使用 @Profile("env1")
,当你使用 @test
时,这个 class 不会调用。尝试删除 Store1Repository
的 @Profile("env1")
。
如果你使用 @test
,两个 store1Sdk/store2Sdk
都不要实例化,尝试添加默认值 instanse.eg
:
@Bean
public store2Sdk buildClientStoreDefault() {
return new store2sdk();
}
尝试@ActiveProfiles({"env1", "test"})
。
使用 @ActiveProfiles
激活多个配置文件并将配置文件指定为数组。
我有一个 spring-boot 应用程序,现在需要支持多个对象存储并根据环境有选择地使用所需的存储。基本上我所做的是创建一个接口,每个存储库然后实现该接口。
我已经简化了示例的代码。 我根据确定环境的 spring 配置文件为每种商店类型创建了 2 个 bean:
@Profile("env1")
@Bean
public store1Sdk buildClientStore1() {
return new store1sdk();
}
@Profile("env2")
@Bean
public store2Sdk buildClientStore2() {
return new store2sdk();
}
在服务层中,我已经自动连接了接口,然后在存储库中,我使用了@Profile 来指定要使用的接口实例。
public interface ObjectStore {
String download(String fileObjectKey);
...
}
@Service
public class ObjectHandlerService {
@Autowired
private ObjectStore objectStore;
public String getObject(String fileObjectKey) {
return objectStore.download(fileObjectKey);
}
...
}
@Repository
@Profile("env1")
public class Store1Repository implements ObjectStore {
@Autowired
private Store1Sdk store1client;
public String download(String fileObjectKey) {
return store1client.getObject(storeName, fileObjectKey);
}
}
当我使用配置的“env”启动应用程序时,它实际上按预期运行。然而,当 运行 测试时,我得到“没有符合条件的 ObjectStore 类型的 bean。预计至少有 1 个符合自动装配候选资格的 bean。”
@ExtendWith({ SpringExtension.class })
@SpringBootTest(classes = Application.class)
@ActiveProfiles("env1,test")
public class ComposerServiceTest {
@Autowired
private ObjectHandlerService service;
@Test
void download_success() {
String response = service.getObject("testKey");
...
}
}
如测试中的@ActiveProfile 所述class 还有一些其他环境,例如开发、测试、生产。我试过使用组件扫描,在同一个包中使用 impl 和 interface 等,但没有成功。我觉得我在测试设置中遗漏了一些明显的东西。但是可能与我的整体应用程序配置有关?我的解决方案的主要目的是避免出现
的长线 if (store1Sdk != null) {
store1Sdk.download(fileObjectKey);
}
if (store2Sdk != null) {
store2Sdk.download(fileObjectKey);
}
这个问题是因为 Store1Repository 使用 @Profile("env1")
,当你使用 @test
时,这个 class 不会调用。尝试删除 Store1Repository
的 @Profile("env1")
。
如果你使用 @test
,两个 store1Sdk/store2Sdk
都不要实例化,尝试添加默认值 instanse.eg
:
@Bean
public store2Sdk buildClientStoreDefault() {
return new store2sdk();
}
尝试@ActiveProfiles({"env1", "test"})
。
使用 @ActiveProfiles
激活多个配置文件并将配置文件指定为数组。