java 如何让wirerock在Spring Boot 应用程序状态上升之前运行?

6yjfywim  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(146)

我有一个spring Boot 微服务的集成测试。问题是服务在启动时调用外部服务(通过REST)。我使用WireMock来模拟调用。Spring使应用程序在WireMock启动之前启动。因此,rest调用失败,服务也失败。
调用是由一个库发出的,这个库也是我们公司发出的,所以我不能在那里更改任何东西。
你对我有什么建议吗?

8fq7wneg

8fq7wneg1#

你可以在测试中创建WireMockServer的静态示例。2下面是一个代码示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTests {
    static WireMockServer mockHttpServer = new WireMockServer(10000); // endpoint port here

    @BeforeClass
    public static void setup() throws Exception {
        mockHttpServer.stubFor(get(urlPathMatching("/")).willReturn(aResponse().withBody("test").withStatus(200)));
        mockHttpServer.start();
    }

    @AfterClass
    public static void teardown() throws Exception {
        mockHttpServer.stop();
    }

    @Test
    public void someTest() throws Exception {
        // your test code here
    }
}
kqqjbcuj

kqqjbcuj2#

Sping Boot 团队已经构建了一个WireMock集成。可能值得一试,而不是自己推出:http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.2.RELEASE/#_spring_cloud_contract_wiremock

pxy2qtax

pxy2qtax3#

我已经迟到了,但我已经为同样的事情挣扎了好几次,虽然公认的答案在许多情况下都有效,但我想出了以下解决方案:
https://github.com/ThomasKasene/wiremock-junit-extension
这是一个定制的JUnit Jupiter扩展,你可以把它放在测试类上,它会为你启动服务器,很像Spring Cloud Contract的版本,不同的是它与Spring上下文分离,所以它可以在Spring启动它的上下文之前启动。

mccptt67

mccptt674#

如果您在JUnit测试中以编程方式运行Wiremock,则可能会遇到争用情况,因为start()是非阻塞的。请查看官方文档here,它指出在JUnit测试上下文中:

  • 对于JUnit 4.x和JUnit 5 Vintage,应使用WireMock中包含的JUnit规则
  • 对于JUnit 5+ Jupiter,请使用JUnit Jupiter扩展
wgeznvg7

wgeznvg75#

在我的例子中,静态配置在本地和CI中工作,直到我们将CI迁移到云。由于某种原因,一个测试失败了,因为一个Spring bean在启动时通过调用远程服务来初始化其缓存,而wirerock在那时不可用。因此该高速缓存将为空。
为什么会发生这种情况?我不知道。但是在添加了更多的日志之后,为了跟踪Spring Bean何时被示例化以及Wiremock何时被设置,我意识到Spring Bean正在从以前的测试中被重用。
因此,除了静态配置之外,我的解决方案是在测试中添加@DirtiesContext(classMode = ClassMode.BEFORE_CLASS),以确保在运行测试之前重新加载整个Spring上下文

相关问题