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

问题描述 投票:0回答:3

我有一个 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 获得。

java spring spring-boot spring-cloud-feign feign
3个回答
5
投票

目前还没有开箱即用的解决方案来提供像@FeignTest 这样的东西。然而,有人为此找到了解决方案here。 该解决方案添加了所需的功能。它也已被提议到 spring-cloud-openfeign

如果您不想包含上述依赖项,我通过手动导入一些 AutoConfiguration 类来创建一个示例,以仅加载必要的功能。请参阅此处使用此测试配置进行测试的Feign客户端

唯一的缺点是wiremock随机端口无法及时扩展。这就是为什么它有一个固定端口。


0
投票

感谢 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()
)

使用 FeignTest 配置:

@TestConfiguration
@EnableFeignClients()
@Import(value = [FeignAutoConfiguration::class, JacksonAutoConfiguration::class, HttpMessageConvertersAutoConfiguration::class])
class TestFeignConfiguration

在您的测试中只需使用 @FeignClient([YourFeignClient::class]) (kotlin,对于 Java 可能是 .class)

通过将端口设置为0,它将被随机设置。

要为您的网址设置随机端口,您只需在配置中配置网址即可。例如:

clients:
  yourFeignClient:
    url: http://localhost:${wiremock.server.port}

对于固定端口,您可以将 @AutoConfigureWireMock(port = 0) 替换为另一个端口,或者使用 @WireMockTest(httpPort = 9099) 例如


0
投票

我根据答案编译了解决方案,并做了注释,使您可以非常快速地运行假客户端测试:

@Target(ElementType.TYPE)
@ActiveProfiles("test")
@WireMockTest(httpPort = 8090)
@SpringBootTest(classes = {
        FeignAutoConfiguration.class,
        HttpClientConfiguration.class,
        HttpClientFeignConfiguration.class,
        JacksonAutoConfiguration.class,
        HttpMessageConvertersAutoConfiguration.class
})
@Retention(RetentionPolicy.RUNTIME)
@EnableFeignClients
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public @interface FeignTest {
}
© www.soinside.com 2019 - 2024. All rights reserved.