1、问题

最近在学习契约测试,用到的是spring-cloud-contract,网上有很多教程,便试着照葫芦画瓢的方式,来实现一遍。由提供者建立契约、生成存根,然后把存根交给消费方测试时,抛出了一个异常No stubs or contracts were found for [XXX],详细异常如下:

Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not find artifact com.contract:ContractTest:jar:stubs:0.0.1-SNAPSHOTat shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:423) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:225) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:202) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:257) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.AetherStubDownloader.unpackedJar(AetherStubDownloader.java:185) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]... 78 common frames omitted
Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact com.contract:ContractTest:jar:stubs:0.0.1-SNAPSHOTat shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:413) ~[spring-cloud-contract-shade-2.2.2.RELEASE.jar:2.2.2.RELEASE]... 82 common frames omitted//省略...Caused by: java.lang.IllegalArgumentException: No stubs or contracts were found for [com.contract:ContractTest:0.0.1-SNAPSHOT:stubs] and the switch to fail on no stubs was set.at org.springframework.cloud.contract.stubrunner.CompositeStubDownloader.downloadAndUnpackStubJar(CompositeStubDownloaderBuilder.java:77) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.StubRunnerFactory.createStubsFromServiceConfiguration(StubRunnerFactory.java:75) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.BatchStubRunnerFactory.buildBatchStubRunner(BatchStubRunnerFactory.java:69) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration.batchStubRunner(StubRunnerConfiguration.java:87) ~[spring-cloud-contract-stub-runner-2.2.2.RELEASE.jar:2.2.2.RELEASE]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_151]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_151]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_151]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_151]at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]... 67 common frames omitted

根据异常可知道大致的意思是找不到存根。spring-cloud-contract我用的是2.2.2-RELEASE版本,消费方使用的存根是指向本地的maven仓库的,代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@AutoConfigureStubRunner(ids = {"com.contract:ContractTest:0.0.1-SNAPSHOT:stubs:8080"},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class TestConsumer {}

然后我找了一下本地的仓库,发现是有ContractTest:0.0.1-SNAPSHOT-stubs.jar这个存根的,但为啥找不到呢?百思不得其姐…于是网上找答案,也很少相关的答案。于是只能“吃自己”了…

2、源码跟踪

网上找不到答案,那只能搜索一下源码了,因为我觉得问题应该是出在查找本地仓库那块了。因为StubsMode有三种情况,现在我用的是LOCAL。

 public enum StubsMode {CLASSPATH,//类路径LOCAL,//本地REMOTE,//远程}

于是我查找了StubsMode的引用,一路跟踪,最终找到了读取本地库的位置,就是这个localRepositoryDirectory方法

 public static RepositorySystemSession newSession(RepositorySystem system,boolean workOffline) {DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();session.setOffline(workOffline);if (!workOffline) {session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS);}session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_WARN);String localRepositoryDirectory = localRepositoryDirectory(workOffline);//加载本地仓库的目录if (log.isDebugEnabled()) {log.debug("Local Repository Directory set to [" + localRepositoryDirectory+ "]. Work offline: [" + workOffline + "]");}LocalRepository localRepo = new LocalRepository(localRepositoryDirectory);session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));return session;}

深入这个方法,最后来到了"罪魁祸首"的地方—userSettings方法,这个方法里面有个读取系统变量的过程,就是fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION),MAVEN_USER_SETTINGS_LOCATION常量值是org.apache.maven.user-settings,由上下文可以得知这个是配置maven仓库的setting.xml的路径,如果不设置这个路径,就会默认找user.home路径下的那个setting.xml。这我才想起,我的maven仓库并不是在user.home下的,而是另外建了个仓库地址!

 private static File userSettings() {//MAVEN_USER_SETTINGS_LOCATION=org.apache.maven.user-settingsString user = fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION);if (user == null) {return new File(new File(System.getProperty("user.home")).getAbsoluteFile(),File.separator + ".m2" + File.separator + "settings.xml");}return new File(user);}

3、解决问题

得知了原因,问题就好解决了,只要把系统参数org.apache.maven.user-settings设置为正确的地址不就可以了?我用的是eclipse,在启动设置那里添加环境变量,来设置setting.xml的位置。

重启消费方,发现问题得解!!!

4、结论

从这个案例来看,我们不由得感叹阅读源码的重要性!源码不仅可以让你学习到很多思想,而且可以帮助你解决问题。网上可能有问题的解决方案,但是有时候你只知道怎么解决问题,但不知道为啥这样解决。源码可以让你从根本上去认知这套框架、系统,对于问题的解答,你也可以从最根源出着手!

契约测试 No stubs or contracts were found for [XXX]问题解决相关推荐

  1. 【转】契约测试的必要性

    由于工作的原因,最近一直在研究API接口测试问题,因为前后端开发经常遇到进度不一致.信息不对称的情况,最近正在找寻能完美解决这个问题的方案.尝试寻找了一下,发现这其实是一个契约测试问题,在博客园上找到 ...

  2. 为什么要抛弃Pact?如何快速实现契约测试(CDC)

    前言 在前几天的博客中,我转载了一篇文章,其中介绍了契约测试和pact是怎么实施的,的确很有帮助.但我经过研究,其实是pact本身也是有缺陷的,结合我近期在使用的服务型工具和我的实际情况,觉得实现契约 ...

  3. Spring Cloud Contract 契约测试实践

    本文转载公众号:永辉云创技术 该号由我参与维护,欢迎大家关注支持!!! 分布式研发模型演进 众所周知, 分布式系统是由众多微服务构成,并按照功能模块划分后, 由不同的开发小组进行维护. 研发模型如下图 ...

  4. 消费者驱动的契约测试 Spring Cloud Contract介绍

    消费者驱动的契约测试 Spring Cloud Contract介绍 什么是契约测试 测试是软件流程中非常重要,不可或缺的一个环节.一般的测试分为单元测试,集成测试,端到端的手工测试,这也是构成测试金 ...

  5. 契约测试概念以及契约测试框架SCC VS PACT对比

    契约测试 基于契约,对消费者与生产者间的协作的验证, 本质上就是验证生产者所提供的内容是否满足消费者的期望. 契约测试在行业内,主要分为两种类型,消费者驱动的契约测试和生产者驱动的契约测试,最常见的就 ...

  6. 多个微服务的接口依赖如何测试_微服务测试之接口测试和契约测试

    日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速.高效.无遗漏的通知给消费者呢?另外,当一个service同时被多个使用者调 ...

  7. 消费者驱动的微服务契约测试套件:Spring Cloud Contract

    在微服务架构下,你的服务可能由不同的团队提供和维护,在这种情况下,接口的开发和维护可能会带来一些问题,比如服务端调整架构或接口调整而对消费者不透明,导致接口调用失败. 为解决这些问题,Ian Robi ...

  8. 消费者驱动的微服务契约测试套件Spring Cloud Contract

    在微服务架构下,你的服务可能由不同的团队提供和维护,在这种情况下,接口的开发和维护可能会带来一些问题,比如服务端调整架构或接口调整而对消费者不透明,导致接口调用失败. 为解决这些问题,Ian Robi ...

  9. 契约测试:解决微服务测试的问题

    为什么是契约测试 契约测试(ContractTest)第一次看到我是在Martin Fowler的文章里.(原文在这里感兴趣的可以去看看https://martinfowler.com/bliki/C ...

最新文章

  1. 从numpy开启Python数据科学之旅
  2. 为什么Math.abs(Integr.MIN_VALUE)==Integer.MIN_VALUE
  3. 字节输入流读取字节数据
  4. DateFormat类的format方法和parse方法
  5. 我来告诉你为什么中国民营企业管理失败的原因!
  6. 跟我一起学Oracle 11g【1】----基础回顾
  7. scala List入门到熟悉
  8. SDRAM之持续中。。。。。。
  9. Machine Learning - week 4 - Non-linear Hypotheses
  10. 批处理脚本一键重置mysql的root密码
  11. oracle11g数据库登录01017,连接oracle数据库报错ORA-01017、重置用户的密码
  12. 【产品人卫朋】华为IPD流程体系:集成产品开发框架
  13. 苹果手机温度测试软件,苹果手机测温神器上线啦!
  14. orcad的瞬态分析
  15. CVE-2020-1938/CNVD-2020-10487:Apache Tomcat 远程执行代码漏洞
  16. 一阶系统单位阶跃响应的特点_一阶系统的单位阶跃响应.doc
  17. 趣店预制菜爆火背后,是一场慢节奏的长期主义
  18. 利用ADS快速设计低噪放
  19. 【dva】dva使用与实现(三)
  20. R语言对dataframe行数据进行筛选(row selection)、筛选数据行、基于条件筛选数据行

热门文章

  1. JAVA读取键盘输入的多行数据_java读取键盘输入
  2. python医学科研中能做什么-这个工具,可全网爬取科研圈中外文献!
  3. 软件工程2:需求分析
  4. Dijkstra算法与其最小堆优化
  5. java后台实现生成二维码并且上传的详细介绍
  6. 集群和分布式 区别和优点
  7. 三年来,深圳不断深化区块链电子发票应用推广
  8. OpenWrt 软路由IPv6 DDNS Socat 端口映射
  9. 游戏修改器(Quick Memory Editor) - 是一款功能强大的游戏修改工具
  10. C# 批量修改图片尺寸和DPI