Spring Cloud OpenFeign -如何创建测试片?



我有一个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),例如

相关内容

  • 没有找到相关文章

最新更新