鸡肉部位英文对照

考虑一个负责进行远程调用和获取详细信息的服务类:

 ...  public class CitiesService { private final WebClient.Builder webClientBuilder; private final String baseUrl; public CitiesService( WebClient.Builder webClientBuilder, @Value ( "${cityservice.url}" ) String baseUrl) { "${cityservice.url}" ) String baseUrl) { this .webClientBuilder = webClientBuilder; this .baseUrl = baseUrl; } public Flux<City> getCities() { return this .webClientBuilder.build() .get()  .... 

这是一个Spring Bean,它通过称为“ cityservice.url”的属性来解析要调用的URL。

如果要测试此类,则在使用WebClient时一直使用的方法是使用出色的Wiremock启动模拟服务器,并使用它来测试此类。 Wiremock模拟看起来像这样:

 private static final WireMockServer WIREMOCK_SERVER = new WireMockServer(wireMockConfig().dynamicPort()); ..... WIREMOCK_SERVER.stubFor(get(urlEqualTo( "/cities" )) .withHeader( "Accept" , equalTo( "application/json" )) .willReturn(aResponse() .withStatus( 200 ) .withHeader( "Content-Type" , "application/json" ) .withBody(resultJson))); 

Wiremock服务器正在一个随机端口上启动,并设置为响应名为“ / cities”的终结点。 这是鸡肉和鸡蛋问题的出处:

1. CitiesService类要求在开始测试之前设置名为“ cityservice.url”的属性。

2. Wiremock在一个随机端口上启动,它响应的URL是“ http:// localhost:randomport”,并且仅在测试开始后才可用。

我可以想到三种可能的解决方案来打破这种循环依赖关系:

方法1:使用硬编码端口

这种方法取决于在固定端口而不是动态端口上启动Wiremock,这样可以在启动测试时设置属性,如下所示:

 @ExtendWith (SpringExtension. class )  @SpringBootTest (classes = CitiesServiceHardcodedPortTest.SpringConfig. class , properties = "cityservice.url= http://localhost:9876 " )  public class CitiesServiceHardcodedPortTest { private static final WireMockServer WIREMOCK_SERVER = new WireMockServer(wireMockConfig().port( 9876 )); 

在此,Wiremock在端口9876上启动,并且启动时的属性设置为“ http:// localhost:9876 /”。

这解决了问题,但是,这不是CI服务器友好的,端口可能在运行时发生冲突,这导致测试不稳定。

方法2:不使用Spring进行测试

更好的方法是按照以下方式不使用该属性:

 public class CitiesServiceDirectTest { private static final WireMockServer WIREMOCK_SERVER = new WireMockServer(wireMockConfig().dynamicPort()); private CitiesService citiesService; @BeforeEach public void beforeEachTest() { final WebClient.Builder webClientBuilder = WebClient.builder(); this .citiesService = new CitiesService(webClientBuilder, WIREMOCK_SERVER.baseUrl()); } 

这里通过在构造函数中显式设置baseUrl来创建服务,从而避免了在测试之前设置属性的需求。

方法3:应用程序上下文初始化器

ApplicationContextInitializer用于以编程方式初始化Spring Application Context,它可以与测试一起使用,以在执行实际测试之前注入属性。 遵循以下原则:

 @ExtendWith (SpringExtension. class )  @SpringBootTest (classes = CitiesServiceSpringTest.SpringConfig. class )  @ContextConfiguration (initializers = {CitiesServiceSpringTest.PropertiesInitializer. class })  public class CitiesServiceSpringTest { private static final WireMockServer WIREMOCK_SERVER = new WireMockServer(wireMockConfig().dynamicPort()); @Autowired private CitiesService citiesService; @Test public void testGetCitiesCleanFlow() throws Exception { ... } static class PropertiesInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { TestPropertyValues.of( "cityservice.url=" + " http://localhost: " + WIREMOCK_SERVER.port() ).applyTo(applicationContext.getEnvironment()); } }  } 

首先启动Wiremock,然后使用初始化程序初始化Spring上下文,该初始化程序使用Wiremocks动态端口注入“ cityservice.url”属性,这种属性可用于连接到CityService。

结论

我个人更喜欢方法2,但是最好在测试之前创建Spring的连线和相关的bean,如果类利用了这些,那么我更喜欢方法3。应用程序上下文初始化器提供了一种解决鸡和鸡蛋问题的好方法。这些属性需要在Spring的上下文参与之前提供。

所有代码示例均在此处提供:

方法1:https://github.com/bijukunjummen/reactive-cities-demo/blob/master/src/test/java/samples/geo/service/CitiesServiceHardcodedPortTest.java

方法2:https://github.com/bijukunjummen/reactive-cities-demo/blob/master/src/test/java/samples/geo/service/CitiesServiceDirectTest.java 方法3:https://github.com/bijukunjummen/reactive-cities-demo/blob/master/src/test/java/samples/geo/service/CitiesServiceSpringTest.java

翻译自: https://www.javacodegeeks.com/2019/08/chicken-egg-resolving-spring-properties-ahead-test.html

鸡肉部位英文对照

鸡肉部位英文对照_鸡肉和鸡蛋–测试前解决Spring属性相关推荐

  1. 鸡肉和鸡蛋–测试前解决Spring属性

    考虑一个负责进行远程调用和获取详细信息的服务类: ... public class CitiesService { private final WebClient.Builder webClientB ...

  2. 鸡兔同笼python程序怎么写_鸡肉的做法大全_怎么做好吃_家常做法_下厨房

    别名:家鸡肉.母鸡肉.公鸡肉 存储时间:1-2天 鸡肉肉质细嫩,滋味鲜美,由于其味较淡,因此可使用于各种料理中.蛋白质的含量颇多,在肉之中,可以说是蛋白质最高的肉类之一,是属于高蛋白低脂肪的食品.钾硫 ...

  3. 删除你的所有计算机文件的英文,《电脑文件英文对照》.doc

    <电脑文件英文对照>.doc ?? Documents and Settings是什么文件?答案: 是系统用户设置文件夹,包括各个用户的文档.收藏夹.上网浏览信息.配置文件等. 补:这里面 ...

  4. 这些“黑话”只有PCB设计制造内行人才懂!附PCB术语及英文对照

    ▍ Test Coupon:俗称阻抗条 Test Coupon,是用来以 TDR (Time Domain Reflectometer 时域反射计) 来测量所生产的 PCB 的特性阻抗是否满足设计的要 ...

  5. Altium Designer系列: DRC规则英文对照

    说明: 本文原创作者『Allen5G』 首发于微信公众号『Allen5G』,同时也更新在我的:CSDN,简书 标签:嵌入式软件,算法,架构 Altium designer DRC规则英文对照 DRC ...

  6. Ask Tom之中英文对照20051228——PL/SQL函数返回CLOB类型值

    Ask Tom之中英文对照20051228--PL/SQL函数返回CLOB类型值 问: 我已经通读了相关文档,但是在实际应用中仍然不太清楚我的理解是否确切. 我已经创建了如下的函数--产生一个小的结果 ...

  7. 对外贸易常用词汇(中、英文对照)

    对外贸易常用词汇(中.英文对照) 1. 商业科 A above par 高于票面值 absolute advantage 绝对优势 acceptance (l)承兑:承兑票据,(2)承诺 accept ...

  8. 《精通数据仓库设计》中英对照_第三章

    <精通数据仓库设计>中英对照_第三章 第二部分 模型开发 数据仓库应该表示企业数据的各个方面,这些方面以主题域和业务数据模型开始.我们将在第3章使用一个假想的公司,指导一步一步地开发这两个 ...

  9. 正则匹配-首字母是$ _ 英文 ,内容包括英文 数字 $ _

    网上找了一圈也没找到匹配首字母$,就和小伙伴试了出来 首字母是$ _ 英文 ,内容包括英文 数字 $ _: 正则:new RegExp('^(\\$|[a-zA-Z_])[a-zA-Z0-9_\\$] ...

最新文章

  1. 清理Oracle安装目录里的一些日志信息
  2. Excel打印区域设置
  3. 全面理解Java中的String数据类型
  4. 史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
  5. Ibatis查询条件对于特殊字符的处理方法
  6. 我如何在20小时内为AWS ML专业课程做好准备并进行破解
  7. 就业阶段-java语言进价_day03
  8. Huffman树压缩和解压文件
  9. IO流和集合的交集Properties类的介绍。
  10. n的整数倍补集的抓取python_python高阶(四)——集合学习
  11. 侯策:如何突破前端开发技术瓶颈
  12. [HIHO1079]离散化(线段树、染色)
  13. 胡寿松《自动控制原理》课后习题重点题与考研刷题指南(ch1-4)
  14. Excel构建决策分析模型
  15. Element DatePicker 日期选择器限定日期选择范围
  16. 大数据带来新机遇:如何利用大数据技术优化跨境电商运营?
  17. 2020年最鼓舞人心的句子
  18. iOS逆向-支付宝基金之统计实时收益
  19. webrtc入门:1.使用getUserMedia获取摄像头流
  20. ftp服务器可以异地传文件吗,FTP图片上传到异地服务器

热门文章

  1. [USACO19JAN,Platinum]Train Tracking 2
  2. nssl1338-逃亡路径【最短路计数,bfs】
  3. P5135-painting【组合数学】
  4. jzoj4382-[GDOI2016模拟3.11]历史【并查集】
  5. 【最大流】牛棚安排(jzoj 1259)
  6. 【线段树】矮人排队(jzoj(gz) 3236)
  7. 洛谷 一种堆套路 P1631序列合并、P2085最小函数值
  8. 教你用 3 台机器搞定一个 Redis 高可用架构
  9. MySQL date_format()函数
  10. JVM内存管理------垃圾搜集器精解