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

kmpatx3s  于 2023-04-06  发布在  Spring
关注(0)|答案(2)|浏览(126)

我有一个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上找到。

yuvru6vn

yuvru6vn1#

目前还没有现成的解决方案,有一个像@FeignTest的东西。然而,有人提出了一个解决方案,这个被发现here。这个解决方案添加了所需的功能。它也一直是proposed to spring-cloud-openfeign
如果您不想包含上述依赖性,我创建了一个示例,通过手动导入一些AutoConfiguration类来仅加载必要的功能。
唯一的缺点是wirerock的随机端口不能及时扩展,这就是为什么它有一个固定的端口。

fgw7neuy

fgw7neuy2#

感谢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 {};
}

Kotlin:

@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)
通过将端口设置为0,它将被随机设置。
要为您的url设置随机端口,您只需在配置中配置url。例如:

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

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

相关问题