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

鸡肉部位英文对照

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

 ...  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

鸡肉部位英文对照

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git pull忽略指定文件_Git忽略提交规则

在使用Git的过程中&#xff0c;我们喜欢有的文件比如日志&#xff0c;临时文件&#xff0c;编译的中间文件等不要提交到代码仓库&#xff0c;这时就要设置相应的忽略规则&#xff0c;来忽略这些文件的提交。简单来说一个场景&#xff1a;在你使用git add .的时候&#xff0c;遇…

lombok var_使用var,Lombok和Fluxtion轻松处理事件

lombok var介绍 在本文中&#xff0c;我将结合使用Lombok和Fluxtion这两种产品&#xff0c;以展示工具如何在减少代码编写和交付时间的同时提高代码的可读性。 使用Java 10中的var可以进一步改善这种情况。 产品和var都在构建时使用推断来加速开发。 Fluxtion的精神是最大程度…

更换mysql_安利给你,关于MySQL字符集乱码与解决方案

推荐阅读&#xff1a;闭关修炼21天&#xff0c;“啃完”283页pdf&#xff0c;我终于4面拿下字节跳动offer肺炎在家“闭关”&#xff0c;阿里竟发来视频面试&#xff0c;4面顺利拿下offer字符集是一套符号和编码的规则&#xff0c;不论是在oracle数据库还是在mysql数据库&#x…

api自动化_如何在不增加人员的情况下自动化API安全程序

api自动化在这篇文章中&#xff0c;我们将撰写一篇综合文章&#xff0c;内容涉及如何在不增加人员的情况下自动执行API安全程序。 在现代世界中&#xff0c;数据对于提供者和消费者都至关重要。 数据科学的出现证明了这一事实。 对于某些组织&#xff0c;整个业务模型是建立在信…

kali用x-shell连接_良心国产工具,比Xshell好用还免费!

使用或维护Linux系统的都知道&#xff0c;我们日常对服务器的操作&#xff0c;一般都会借助SSH工具远程登录到服务器之后进行操作。常用的SSH工具有不少&#xff0c;比如&#xff1a;Xshell、Putty、SSH Secure Shell Client、secureCRT等等。民工哥使用过其中两种secureCRT和X…

ibm liberty_使用Open Liberty的开发模式最大程度地缩短周转时间

ibm liberty我上传了一个视频&#xff0c;其中显示了如何在编写部署在Open Liberty上的Enterprise Java应用程序时减少周转时间。 Maven插件的liberty:dev目标监视文件更改并立即应用更改&#xff0c;而无需重建整个部署工件。 我将展示在更改源代码&#xff0c;配置&#xff…

vue 分模块打包 脚手架_一步步从头搭建 Vue 开发环境

前言由于是工具&#xff0c;很可能你看到的时候有些工具包已经升级了&#xff0c;会有一些报错&#xff1b;这个你就需要自己探索了。工具的版本node: v10.16.0npm: v6.9.0babel: 7.5.5webpack: 4.38.0入题提醒&#xff1a;在我们开始之前&#xff0c;你先检查下你相关工具的包…

stomp java客户端_Stomp-Spring服务器端的Web套接字Java客户端

stomp java客户端问题&#xff1a; 为了分析问题&#xff0c;我不得不编写一个简单的Java Web套接字客户端站点代码&#xff0c;并使用基于stomp的Web套接字代理连接到服务器端基于Spring的应用程序。 解决方案&#xff1a; pom.xml <?xml version"1.0" encodi…

tf.metrics._将指标标签与MicroProfile Metrics 2.0一起使用

tf.metrics.从我们的应用程序发出的与业务相关的度量标准可能包含要为其测量特定度量标准的参数&#xff08;即标签或标签 &#xff09;。 从MicroProfile Metrics 2.0开始&#xff0c;可以使用API​​将标签分配给特定的指标。 声明式方法 假设我们有以下资源&#xff1a; P…

ppt课堂流程图_除了直线能设计PPT,没想到曲线也实用,太赞了!

前几天在分享PPT设计的方法时&#xff0c;收到反馈&#xff0c;问这种曲线是如何设计以及怎么用&#xff1f;其实对于曲线&#xff0c;如果用好了比直线更加有效果&#xff0c;曲线本身自带动态效果&#xff0c;看一下。除此之外&#xff0c;曲线不仅可以用在PPT中&#xff0c;…

算法分析

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff1b;旨在了解 算法分析涉及到的数学基础、时间复杂度分析法则、和其它的一些法则 和 结论&#xff1b; 【1】 数学基础 1.1&#xff09;本书将使用以下4个定义&#xff1a; 对上述定义的分析&#xff0…

java文件端点续传效果图_Java单依赖性Dockerized HTTP端点

java文件端点续传效果图在本文中&#xff0c;我们将创建一个基于Java的HTTP端点&#xff0c;使用它创建一个可执行jar&#xff0c;将其打包在Docker中并立即在本地运行。 本文面向初学者&#xff0c;他们想要寻找一个简单的演练来在Docker中运行Java应用程序。 描述Dockerize…

立镖机器人浙江_立镖在美国获2020 NextGen供应链解决方案奖

Tompkins Robotics荣获2020 NextGen供应链解决方案提供商奖汤普金斯国际被《供应链管理评论》指定为机器人技术类获奖者2020年3月20日消息Tompkins International的业务部门 Tompkins Robotics被选为第二届年度NextGen供应链奖的获得者。汤普金斯机器人技术公司是《供应链管理…

final 实例域+final类+final方法(阻止继承)

【0】README 0.1&#xff09;本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理清 “final 实例域”&#xff1b; 0.2&#xff09; 最后还增加了 阻止继承 的内容&#xff0c;涵盖了final类final方法&#xff1b; 0.3&#xff09; 引入了 内联 以及 即时编译器对…

java责任链设计模式_Java中的责任链设计模式

java责任链设计模式在本教程中&#xff0c;我们将学习如何在Java中实现责任链模式。 责任链设计模式涉及到拥有一系列负责处理请求的对象链。 当客户端发送请求时&#xff0c;第一个处理程序将尝试处理该请求。 如果可以处理&#xff0c;则请求处理在此结束。 但是&#xff0c…

机加工程序工时程序_团宠来袭 | 针对多品种小批量的机加工柔性生产解决方案...

“天下之至柔&#xff0c;驰骋天下之至坚。无有入于无间&#xff0c;吾是以知无为之有益。”老子指出&#xff0c;世间最柔弱的东西里面往往蓄着人们看不见的巨大力量&#xff0c;使得最坚强的东西也无法抵挡。就像水是最柔的东西&#xff0c;但却能穿透山地。柔性的力量不容小…

静态方法+工厂方法(静态方法用途)

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在了解 “静态方法”&#xff1b; 【1】静态方法相关 1.1&#xff09;静态方法是一种不能向对象实施操作的方法&#xff1b; 如&#xff0c;Math.pow(x, a)&#xff0c; 在运算时&#…

一致吗 驱动_iPhone 12无线充电真的香吗?

2020年10月14日凌晨1点&#xff0c;苹果发布会又来了&#xff0c;开场就是苹果CEO库克在总部贾伯斯剧院闪亮登场&#xff01;没错&#xff01;各位果粉心心念念的 iPhone 12 它走来了&#xff01;如之前爆料所言&#xff0c;本次发布会共推出了4款机型&#xff1a;iPhone 12 mi…

spring boot注释_Spring Boot中的@SpringBootConfiguration注释

spring boot注释Spring Boot中的 SpringBootConfiguration注释是一个类级别的注释&#xff0c;它指示此类提供了应用程序配置。 通常&#xff0c;具有main&#xff08;&#xff09;方法的类最适合此注释。 我们通常使用SpringBootApplication批注&#xff0c;该批注会自动继承…

selenium自动化测试_Selenium测试可实现有效的测试自动化

selenium自动化测试尽管移动应用程序的市场份额有大幅增长&#xff0c;但网络应用程序仍然具有大量的用户基础。 在部署之前&#xff0c;企业正在关注Web应用程序的质量。 这是测试发挥重要作用的地方。 与某些可以自动化的功能测试不同&#xff0c;UI测试仍然大部分是手动过程…