[英]Integration Tests with PowerMock and Spring Boot
我正在Spring Boot应用程序上进行一些集成测试。
通常,我用来开发的集成测试是关于应用程序领域的,没有涉及任何外部服务。 自从这次以来,我需要对同时使用数据库和SDK调用的外部服务的服务进行集成测试,因此我尝试执行以下操作:
@RunWith(PowerMockRunner::class)
@SpringBootTest
@PowerMockRunnerDelegate(SpringRunner::class)
@PrepareForTest(McpProductService::class)
class MyServiceIntegration {
@Mock
private ExternalService externalService;
@Autowired
@InjectMocks
private MyServiceImpl myService;
@Test
public void thisTestShouldWork() {
...
}
}
让我感到困惑的是:我应该如何声明myService
属性? 通常,当我在单元测试中使用Mockito + PowerMock时,通常会测试实现,而不是整个服务接口+ Spring注入。 但是,如果我仅使用@Autowired
而不是接口,则不能使用它。
我所面临的这个问题是否有最佳实践?
免责声明:我假设您所追求的是服务接口的端到端测试,并由多个类支持。 我假设(并希望)您没有一个同时处理数据库和Web服务集成的类。
我看不到这里需要使用PowerMock的情况,通常这是一种用于测试具有大量静态内容的旧代码的东西。 如果您使用的是Spring Boot,则代码的质量应使PowerMock不再需要。
编写端到端测试时,原理与每类单元测试相同,只是范围更大:
因此,在这里,您应该找到一种机制来模拟与外部资源(例如Web服务客户端,数据库类)进行通信的代码部分(如果您不使用内存数据库进行测试(应该这样做))。 这通常是一个Spring配置,与生产中使用的配置几乎相同,但其中的零件被模拟掉了。 然后,您只需@Inject
您需要与之通信的零件即可完成测试。
假设对所有bean使用组件扫描和注释,则可以模拟端点类并使用配置文件:
该代码仅基于内存,可能不适用于复制粘贴,但希望您可以使用这些概念。
@Profile("test")
@Configuration
public class TestConfiguration {
@Bean
@Primary
public SomeWebserviceClient someWebserviceClient() {
return mock(SomeWebserviceClient.class);
}
}
生产代码:
@Service
public class SomeClass {
@Inject
private SomeWebserviceClient client;
}
然后在测试中:
@RunWith(PowerMockRunner::class)
@SpringBootTest
@ActiveProfiles("test")
public class SomeTest {
@Inject
private SomeClass someClass;
@Inject
private SomeWebserviceClient client; //<< will inject mock
}
模拟也将注入SomeClass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.