我需要针对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)?
答案 0 :(得分:2)
我不明白为什么要在集成测试中使用真实服务器。这闻起来很不好。有一名开发人员,我想在没有Internet连接(在飞行模式下)的计算机上运行测试。但是,这就是我为您准备的。
@RestTemplateTest
为您提供了预先配置的RestTemplateBuilder
和MockRestServiceServer
。
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 })
而且你应该对自己的考试好。