gpt4 book ai didi

java - 使用 PowerMock 和 Spring Boot 进行集成测试

转载 作者:行者123 更新时间:2023-11-28 21:22:57 25 4
gpt4 key购买 nike

我正在 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 时,我通常测试实现,而不是整个服务接口(interface) + Spring 注入(inject)。但是如果我只使用它的实现而不是接口(interface),我就不能使用 @Autowired

对于我面临的这个问题,是否有任何最佳实践?

最佳答案

免责声明:我假设您所追求的是一个由多个类支持的服务接口(interface)的端到端测试。我假设(并希望)您没有一个类同时处理数据库和 Web 服务集成。

我认为这里不需要使用 PowerMock,它通常用于测试包含大量静态内容的遗留代码。如果您使用的是 Spring Boot,您的代码应该具有不需要 PowerMock 的质量。

写端到端测试的时候,原理和per-class单元测试是一样的,只是范围更大:

  • 通过单元测试,您可以创建被测类的实例,并模拟其所有外部依赖项(其他类)
  • 通过端到端测试,您可以创建被测模块的“实例”,并模拟其外部依赖项。

因此,在这里您应该找到一种机制来模拟与外部源通信的代码部分,例如 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
}

Mock 也会被注入(inject)到 SomeClass

关于java - 使用 PowerMock 和 Spring Boot 进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47327981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com