日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)

發(fā)布時(shí)間:2023/12/3 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring Data的使命是為數(shù)據(jù)訪問提供一個(gè)熟悉且一致的,基于Spring的編程模型,同時(shí)仍保留基礎(chǔ)數(shù)據(jù)存儲(chǔ)的特??殊特征。 它提供了與一些后端技術(shù)的集成,例如JPA,Rest,MongoDB,Neo4J或Redis。

因此,如果您使用的是Spring(引導(dǎo)),那么Spring Data是處理持久層的正確選擇。

在下一個(gè)示例中,您可以看到使用Spring Boot和Spring Data Redis有多么簡單。

@Controller @EnableAutoConfiguration public class PingPongController {@AutowiredStringRedisTemplate redisTemplate;@RequestMapping("/{ping}")@ResponseBodyList<String> getPong(@PathVariable("ping") String ping) {final ListOperations<String, String> stringStringListOperations = redisTemplate.opsForList();final Long size = stringStringListOperations.size(ping);return stringStringListOperations.range(ping, 0, size);}@RequestMapping(value="/{ping}", method = RequestMethod.POST)ResponseEntity<?> addPong(@PathVariable("ping") String ping, @RequestBody String pong) {final ListOperations<String, String> stringStringListOperations = redisTemplate.opsForList();stringStringListOperations.leftPushAll(ping, pong);URI location = ServletUriComponentsBuilder.fromCurrentRequest().buildAndExpand(ping).toUri();return ResponseEntity.created(location).build();}public static void main(String[] args) {SpringApplication.run(PingPongController.class, args);}}@Configuration public class RedisConfiguration {@BeanStringRedisTemplate template(final RedisConnectionFactory connectionFactory) {return new StringRedisTemplate(connectionFactory);}}

這是通知,缺省時(shí),Spring數(shù)據(jù)Redis的配置連接到本地主機(jī)和端口6379的重要,但是你可以重寫通過設(shè)置系統(tǒng)屬性(spring.redis.host和spring.redis.port)或環(huán)境變量這些值(SPRING_REDIS_HOST和SPRING_REDIS_PORT )。

但是現(xiàn)在是時(shí)候?yàn)檫@段代碼編寫測試了。 您可能會(huì)遇到的主要問題是,需要在所有需要執(zhí)行這些測試的機(jī)器(例如開發(fā)人員機(jī)器或Jenkins從站)中安裝Redis服務(wù)器。

這本身不是問題,但是當(dāng)您開始處理越來越多的項(xiàng)目時(shí),您將需要在系統(tǒng)上安裝越來越多的數(shù)據(jù)庫,甚至更糟糕的是,與生產(chǎn)所需的版本也不完全相同。

為了避免這個(gè)問題,一種可能的解決方案是使用Docker和容器。 因此,您無需依賴于在系統(tǒng)上安裝每個(gè)數(shù)據(jù)庫,而僅依賴Docker 。 然后,測試僅啟動(dòng)存儲(chǔ)庫容器,在我們的示例中為Redis,執(zhí)行測試,最后停止容器。

這就是Arquillian (和Arquillian Cube )在幫助您自動(dòng)化所有事情的地方。
Arquillian Cube是Arquillian擴(kuò)展,可用于管理Arquillian的 Docker容器。

要使用Arquillian Cube,您需要在計(jì)算機(jī)上運(yùn)行Docker守護(hù)程序(它可以是本地的,也可以不是本地的),但是可能是在本地。

默認(rèn)情況下, Docker服務(wù)器使用UNIX套接字與Docker客戶端進(jìn)行通信。 Arquillian Cube將嘗試檢測其正在運(yùn)行的操作系統(tǒng),并將docker -java設(shè)置為在Linux上使用UNIX套接字,或者將Windows / Mac上的Boot2Docker / Docker-Machine設(shè)置為默認(rèn)URI,因此您的測試可在多個(gè)Docker安裝之間移植而且您無需擔(dān)心對(duì)其進(jìn)行配置, Arquillian Cube可以適應(yīng)您所安裝的內(nèi)容。
Arquillian Cube提供了三種定義容器的不同方法。

  • 定義docker-compose文件。
  • 定義一個(gè)容器對(duì)象 。
  • 使用容器對(duì)象DSL 。

在本文中,使用的是Container Object DSL方法。 要定義一個(gè)容器,該容器要在執(zhí)行測試之前啟動(dòng),而在編寫后只需要停止一段代碼之后就停止。

@ClassRule public static ContainerDslRule redis = new ContainerDslRule("redis:3.2.6").withPortBinding(6379);

在這種情況下,將使用JUnit規(guī)則來定義測試中應(yīng)使用的映像( redis:3.2.6 ),并將Redis端口( 6379 )添加為綁定端口。

完整的測試如下所示:

@RunWith(SpringRunner.class) @SpringBootTest(classes = PingPongController.class, webEnvironment = RANDOM_PORT) @ContextConfiguration(initializers = PingPongSpringBootTest.Initializer.class) public class PingPongSpringBootTest {@ClassRulepublic static ContainerDslRule redis = new ContainerDslRule("redis:3.2.6").withPortBinding(6379);@AutowiredTestRestTemplate restTemplate;@Testpublic void should_get_pongs() {// givenrestTemplate.postForObject("/ping", "pong", String.class);restTemplate.postForObject("/ping", "pung", String.class);// whenfinal List<String> pings = restTemplate.getForObject("/ping", List.class);// thenassertThat(pings).hasSize(2).containsExactlyInAnyOrder("pong", "pung");}public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext configurableApplicationContext) {EnvironmentTestUtils.addEnvironment("testcontainers", configurableApplicationContext.getEnvironment(),"spring.redis.host=" + redis.getIpAddress(),"spring.redis.port=" + redis.getBindPort(6379));}}}

注意,這是一個(gè)使用它們的位和鮑勃進(jìn)行的簡單Spring Boot測試,但是測試中使用Arquillian Cube JUnit Rule來啟動(dòng)和停止Redis映像。

最后要注意的一點(diǎn)是,測試包含ApplicationContextInitializer的實(shí)現(xiàn),因此我們可以使用Docker數(shù)據(jù)(Redis容器的主機(jī)和綁定端口)配置環(huán)境,以便Spring Data Redis可以連接到正確的實(shí)例。

最后但并非最不重要的build.gradle文件定義所需的依賴項(xiàng),如下所示:

buildscript {repositories {jcenter()mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE")} }plugins {id "io.spring.dependency-management" version "1.0.2.RELEASE" }apply plugin: 'java' apply plugin: 'org.springframework.boot'repositories {jcenter() }project.version = '1.0.0'dependencyManagement {imports {mavenBom 'org.jboss.arquillian:arquillian-bom:1.1.13.Final'} }dependencies {compile "org.springframework.boot:spring-boot-starter-web:1.5.2.RELEASE"compile 'org.springframework.boot:spring-boot-starter-data-redis:1.5.2.RELEASE'testCompile 'org.springframework.boot:spring-boot-starter-test:1.5.2.RELEASE'testCompile 'junit:junit:4.12'testCompile 'org.arquillian.cube:arquillian-cube-docker-junit-rule:1.2.0'testCompile 'org.assertj:assertj-core:3.6.2' } 您可以在http://arquillian.org/arquillian-cube/上了解有關(guān)Arquillian Cube的更多信息。

翻譯自: https://www.javacodegeeks.com/2017/04/testing-spring-data-spring-boot-applications-arquillian-part-1.html

總結(jié)

以上是生活随笔為你收集整理的使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。