繁体   English   中英

与PowerMock和Spring Boot的集成测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM