在非 Spring 项目中运行 Spring Cloud Contract 测试
Posted
技术标签:
【中文标题】在非 Spring 项目中运行 Spring Cloud Contract 测试【英文标题】:Running Spring Cloud Contract test in non-Spring project 【发布时间】:2018-10-08 08:53:59 【问题描述】:我在 Spring Boot 项目 (spring-server
) 中创建了 Spring Cloud Contract 存根。想要调用此存根的客户端不是 Spring 项目,也不能是 Spring 项目。如果我在客户端运行以下命令:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureStubRunner(ids = "uk.co.hadoopathome:spring-server:+:stubs:8093",
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class ContractTest
@Test
public void testContractEndpoint()
try (CloseableHttpClient httpclient = HttpClients.createDefault())
HttpGet httpGet = new HttpGet("http://localhost:8093/ac01");
CloseableHttpResponse response = httpclient.execute(httpGet);
String entity = EntityUtils.toString(response.getEntity());
assertEquals("ac01returned", entity);
response.close();
catch (IOException ignored)
然后我得到一个错误
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
显然我没有@SpringBootConfiguration
,因为这不是 Spring Boot 项目。
这里有什么解决方法?
【问题讨论】:
【参考方案1】:只需使用 Junit 规则,您就不必设置上下文
public class JUnitTest
@Rule public StubRunnerRule rule = new StubRunnerRule()
.downloadStub("com.example","beer-api-producer")
.withPort(6543)
.workOffline(true);
@Test
public void should_work()
String response = new RestTemplate().getForObject("http://localhost:6543/status", String.class);
BDDAssertions.then(response).isEqualTo("ok");
【讨论】:
您能详细说明一下吗?我找到了cloud.spring.io/spring-cloud-contract/1.0.x/…,但是您必须在客户端代码中创建自己的存根,这不是我要在这里寻找的。span> cloud.spring.io/spring-cloud-static/Edgware.SR3/single/… and samples 和 github.com/spring-cloud-samples/spring-cloud-contract-samples/… 我们确实在文档上投入了时间,但您必须查看最新的发布火车 完美,谢谢。文档非常好,我只是不走运 Ctrl+F :) 我现在正在实施它,当它是绿色的时候会标记出来。 github.com/spring-cloud-samples/spring-cloud-contract-samples/… 仍然需要RunWith(SpringRunner)
和 SpringBootTest
注释,因此除非我做出我在回答中提到的更改,否则我会收到原始错误。我错过了什么吗?【参考方案2】:
我修改了@SpringBootTest
这一行:
@SpringBootTest(classes = ContractTest.class)
然后得到了一些我通过finding this answer 解决并添加到build.gradle
的 Logback 错误:
configurations
all*.exclude module : 'spring-boot-starter-logging'
【讨论】:
以上是关于在非 Spring 项目中运行 Spring Cloud Contract 测试的主要内容,如果未能解决你的问题,请参考以下文章
Spring中如何在非Spring管理的Bean中获取到Spring管理的Bean并操作
springboot-9-在非springboot管理的类引入bean
如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?