我有一个Feign客户端测试,我想设置一个测试片,如@WebMvcTest
,@DataJpaTest
等。
@SpringBootTest
并加载所有应用程序上下文:
@SpringBootTest
@AutoConfigureWireMock(port = 0)
class AgePredictorFeignClientTest {
@Autowired
private AgePredictorFeignClient agePredictorFeignClient;
@Test
void getAge() {
stubFor(get(urlEqualTo("/age-api?name=Henrique"))
.willReturn(aResponse().withBodyFile("25_years_old.json")
.withHeader("Content-Type", "application/json")));
Integer age = agePredictorFeignClient.getAge("Henrique").getAge();
assertThat(age).isEqualTo(25);
verify(getRequestedFor(urlEqualTo("/age-api?name=Henrique")));
}
}
我如何改变这个测试,只加载与Spring Cloud OpenFeign相关的上下文?
此测试应用程序的源代码可从https://github.com/henriquels25/openfeign-tests-sample获得。
目前还没有开箱即用的解决方案来拥有@FeignTest之类的东西。然而,有人在这里找到了一个解决方案。此解决方案添加了所需的功能。也有人提出spring-cloud-openfeign。
如果你不想包含上面的依赖,我已经创建了一个例子,通过手动导入一些AutoConfiguration类来只加载必要的功能。请参阅此处查看正在使用此测试配置
进行测试的Feign客户端唯一的缺点是,wiremock随机端口不能及时扩展。这就是为什么它有一个固定的端口。
感谢Nazeem的回答,他为我提供了为Feign客户端导入的正确配置,我创建了以下测试片,它对我来说工作得很好。
随机端口选项:
Java:
@Target(ElementType.TYPE)
@Retention(RUNTIME)
@SpringBootTest
@AutoConfigureWireMock(port = 0)
@Import(TestFeignConfiguration.class)
public @interface FeignTest {
@AliasFor(annotation = SpringBootTest.class, attribute = "classes")
Class<?>[] classes() default {};
}
芬兰湾的科特林:
@Target(CLASS)
@Retention(RUNTIME)
@SpringBootTest
@AutoConfigureWireMock(port = 0)
@Import(TestFeignConfiguration::class)
annotation class FeignTest (
@get:AliasFor(annotation = SpringBootTest::class, attribute = "classes")
val classes: Array<KClass<*>> = emptyArray()
)
与FeignTestConfiguration:
@TestConfiguration
@EnableFeignClients()
@Import(value = [FeignAutoConfiguration::class, JacksonAutoConfiguration::class, HttpMessageConvertersAutoConfiguration::class])
class TestFeignConfiguration
在您的测试中,只需使用@FeignClient([YourFeignClient::class]) (kotlin,可能是Java的。class)
通过设置port为0,将随机设置。
要为您的url设置随机端口,您可以简单地在配置中配置url。例如:
clients:
yourFeignClient:
url: http://localhost:${wiremock.server.port}
对于fixedPort,您可以将@AutoConfigureWireMock(port = 0)替换为另一个端口或使用@WireMockTest(httpPort = 9099),例如