javascript
使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)
Spring Data的使命是為數據訪問提供一個熟悉且一致的,基于Spring的編程模型,同時仍保留基礎數據存儲的特??殊特征。 它提供了與一些后端技術的集成,例如JPA,Rest,MongoDB,Neo4J或Redis。
因此,如果您使用的是Spring(引導),那么Spring Data是處理持久層的正確選擇。
在下一個示例中,您可以看到使用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);}}這是通知,缺省時,Spring數據Redis的配置連接到本地主機和端口6379的重要,但是你可以重寫通過設置系統屬性(spring.redis.host和spring.redis.port)或環境變量這些值(SPRING_REDIS_HOST和SPRING_REDIS_PORT )。
但是現在是時候為這段代碼編寫測試了。 您可能會遇到的主要問題是,需要在所有需要執行這些測試的機器(例如開發人員機器或Jenkins從站)中安裝Redis服務器。
這本身不是問題,但是當您開始處理越來越多的項目時,您將需要在系統上安裝越來越多的數據庫,甚至更糟糕的是,與生產所需的版本也不完全相同。
為了避免這個問題,一種可能的解決方案是使用Docker和容器。 因此,您無需依賴于在系統上安裝每個數據庫,而僅依賴Docker 。 然后,測試僅啟動存儲庫容器,在我們的示例中為Redis,執行測試,最后停止容器。
這就是Arquillian (和Arquillian Cube )在幫助您自動化所有事情的地方。
Arquillian Cube是Arquillian擴展,可用于管理Arquillian的 Docker容器。
要使用Arquillian Cube,您需要在計算機上運行Docker守護程序(它可以是本地的,也可以不是本地的),但是可能是在本地。
默認情況下, Docker服務器使用UNIX套接字與Docker客戶端進行通信。 Arquillian Cube將嘗試檢測其正在運行的操作系統,并將docker -java設置為在Linux上使用UNIX套接字,或者將Windows / Mac上的Boot2Docker / Docker-Machine設置為默認URI,因此您的測試可在多個Docker安裝之間移植而且您無需擔心對其進行配置, Arquillian Cube可以適應您所安裝的內容。
Arquillian Cube提供了三種定義容器的不同方法。
- 定義docker-compose文件。
- 定義一個容器對象 。
- 使用容器對象DSL 。
在本文中,使用的是Container Object DSL方法。 要定義一個容器,該容器要在執行測試之前啟動,而在編寫后只需要停止一段代碼之后就停止。
@ClassRule public static ContainerDslRule redis = new ContainerDslRule("redis:3.2.6").withPortBinding(6379);在這種情況下,將使用JUnit規則來定義測試中應使用的映像( 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));}}}注意,這是一個使用它們的位和鮑勃進行的簡單Spring Boot測試,但是測試中使用Arquillian Cube JUnit Rule來啟動和停止Redis映像。
最后要注意的一點是,測試包含ApplicationContextInitializer的實現,因此我們可以使用Docker數據(Redis容器的主機和綁定端口)配置環境,以便Spring Data Redis可以連接到正確的實例。
最后但并非最不重要的build.gradle文件定義所需的依賴項,如下所示:
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/上了解有關Arquillian Cube的更多信息。翻譯自: https://www.javacodegeeks.com/2017/04/testing-spring-data-spring-boot-applications-arquillian-part-1.html
總結
以上是生活随笔為你收集整理的使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置数据库(设置数据库密码)
- 下一篇: 配置Jenkins以连续交付Spring