@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
}
}
5条答案
按热度按时间8fq7wneg1#
你可以在测试中创建WireMockServer的静态示例。2下面是一个代码示例:
kqqjbcuj2#
Sping Boot 团队已经构建了一个WireMock集成。可能值得一试,而不是自己推出:http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.1.2.RELEASE/#_spring_cloud_contract_wiremock
pxy2qtax3#
我已经迟到了,但我已经为同样的事情挣扎了好几次,虽然公认的答案在许多情况下都有效,但我想出了以下解决方案:
https://github.com/ThomasKasene/wiremock-junit-extension
这是一个定制的JUnit Jupiter扩展,你可以把它放在测试类上,它会为你启动服务器,很像Spring Cloud Contract的版本,不同的是它与Spring上下文分离,所以它可以在Spring启动它的上下文之前启动。
mccptt674#
如果您在JUnit测试中以编程方式运行Wiremock,则可能会遇到争用情况,因为start()是非阻塞的。请查看官方文档here,它指出在JUnit测试上下文中:
wgeznvg75#
在我的例子中,静态配置在本地和CI中工作,直到我们将CI迁移到云。由于某种原因,一个测试失败了,因为一个Spring bean在启动时通过调用远程服务来初始化其缓存,而wirerock在那时不可用。因此该高速缓存将为空。
为什么会发生这种情况?我不知道。但是在添加了更多的日志之后,为了跟踪Spring Bean何时被示例化以及Wiremock何时被设置,我意识到Spring Bean正在从以前的测试中被重用。
因此,除了静态配置之外,我的解决方案是在测试中添加
@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
,以确保在运行测试之前重新加载整个Spring上下文