在非 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并操作

Spring-IOC 在非 web 环境下优雅关闭容器

springboot-9-在非springboot管理的类引入bean

如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?

MyBatis在非Spring环境下第三方DataSource设置-Druid篇

fix bug:Spring中事务不生效的问题