【问题标题】:Spring Boot @RestClientTest how test with real server (not mock)Spring Boot @RestClientTest 如何使用真实服务器进行测试(不是模拟)
【发布时间】:2023-03-30 16:17:02
【问题描述】:

我需要针对 REST API 创建集成测试。我的服务使用 Resttemplate 作为 HTTP 客户端。客户端代码由 swagger 文件生成。

运行测试会产生错误java.lang.AssertionError: No further requests expected: HTTP GET

似乎测试是针对模拟服务器运行的。如何让测试在真实服务器上运行?

这是我当前的测试设置(想剪掉一个最小的测试框架来进行快速测试 - 启动完整的上下文太慢了):

@RunWith(SpringRunner.class)
@Import(value = { TpzConfig.class, TpzServiceRestImpl.class, ManufacturingPlantPhPmMapperImpl.class,
        ProductHierarchyMapperImpl.class, PlantMapperImpl.class })
@ActiveProfiles(profiles = { "tpz" })
@RestClientTest
public class TpzServiceRestImplTest {

    @Autowired
    private TpzService to;

    @MockBean
    private ProductionPlantService ppService;

    @MockBean
    private ProductHierarchyService phService;

    @Test
    public void test() {
        List<ProductManufacturer> pmByProductHierarchy = to.pmByProductHierarchy("001100909100100388");

    }

}

我需要@RestClientTest 来拥有一个 RestTemplateBuilder 的 bean。

有没有办法配置@RestClientTest 使用真实服务器(类似于@DataJpaTest 我可以配置不使用h2)?

【问题讨论】:

    标签: spring-boot integration-testing


    【解决方案1】:

    @RestTemplateTest 为您提供预配置的RestTemplateBuilderMockRestServiceServer

    1.您可以 @Autowired MockRestServiceServer 并模拟预期的 HTTP 调用。


    2.删除自动配置:

    @RestClientTest(excludeAutoConfiguration = MockRestServiceServerAutoConfiguration.class)
    

    但这会使测试有点慢。也许有一种方法可以优化它。


    3.另一方面,您可以删除@RestClientTest 并在测试配置文件中创建RestTemplateBuilder 的bean。像这样:

    @TestConfiguration
    public class TestConfig {
        @Bean
        public RestTemplateBuilder getRestTemplateBuilder() {
            return new RestTemplateBuilder();
        }
    }
    

    在此之后,将此配置文件添加到您的导入中:

    @Import(value = { TpzConfig.class, TpzServiceRestImpl.class, 
    ManufacturingPlantPhPmMapperImpl.class, ProductHierarchyMapperImpl.class, 
    PlantMapperImpl.class, TestConfig.class })
    

    你应该做好你的测试。

    【讨论】:

    • 谢谢。我会试试看。 “我不明白你为什么要在真正的服务器上进行集成测试”:因为它是一个集成测试——这些不必在开发人员机器上运行。集成测试也在不同的构建阶段运行,通常在提供必要环境的 CI 服务器上运行。
    • 我们只是有不同的定义/命名 ;) 我的堆栈是:单元测试、集成测试(在本地启动服务器但模拟外部服务)和 e2e 测试(在具有真实外部服务和 selenium 的环境中运行)电话)。
    • 在我的情况下,我想用另一个模拟服务器运行 Spring 休息测试,而不是 Spring 自己的
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多