基于配置文件 Spring 引导的自动连线实现



我正在使用Spring Boot开发一个REST API.问题是我有一个接口和两个实现,我只想用模拟实现进行测试。

Interface CRMService 
@Service
CRMServiceImpl
@Service
CRMServiceMock

实现:第一个是与后端的真正集成,第二个是用于测试目的的模拟,最好的方法是什么?集成测试还是基于活动配置文件的测试?如果我需要根据配置文件自动连线服务,最佳做法是什么?

虽然我确信有例外,但通常它不应该是集成或单元测试(通常涉及模拟),而是两者兼而有之; 请参阅测试金字塔概念。

集成测试:只需使用真正的服务。如果它调用其他实时服务,请考虑将URL注入为Spring Boot属性,这些属性指向测试环境中的模拟服务器(Node.js或简单快捷的服务器)。

单元测试:考虑使用像 Mockito 这样的测试框架。使用它,您可以使用模拟来编写测试,大致如下所示:

private CRMServiceImpl mockService = mock(CRMServiceImpl.class);
@Test
public void someTest() {
when(mockService.someMethod(any(String.class), eq(5))).thenReturn("Hello from mock object.")
}

上面的例子大致翻译为"当某个类在你的服务上调用'someMethod(String, int)'时,返回指定的字符串"。

这种方式允许您在必要时仍然使用模拟,但避免了维护整个模拟实现配置文件,并避免了自动连接什么的问题。

最后,如果您需要完全独立的实现,请考虑不要自动布线服务!相反,请在配置类中使用@Bean注释,并通过构造函数将其注入到需要它的类中。像这样:

@Configuration
public class ApplicationConfiguration {
@Value{$"service.crm.inmem"} // Injected property
private boolean inMem;
@Bean
CRMService getCRMService() {
if (inMem) {
return new CRMServiceMock();
}
return new CRMServiceImpl();
}
@Bean
OtherService getOtherService() {
// Inject CRMService interface into constructor instead of auto-wiring in OtherService.class
return new OtherService(getCRMService());
}
}

例如,如果要在内存中存储和实际数据库连接层之间切换,则可以使用 ^^。

就个人而言,我建议像上面的例子一样进行依赖注入,即使没有多个实现,因为随着项目的增长,如果自动连线的属性失败,可能很难准确追踪原因。此外,显式显示依赖项的来源有助于组织应用程序和可视化应用程序层次结构。

相关内容

最新更新