Test İçin Farklı Spring DataSource kullanmak

Hep beraber bir Java Spring projede test ve production için nasıl iki farklı veri kaynağını kullanabileceğimize göz atalım.

Veri katman üzerinde yazılan bir Spring uygulamada genelde JPA gibi kütüphaneyi kullanıyoruz. Test sürecinde belki farklı bir DataSource (Veri Kaynağı) kullanmak isteyebiliriz. Bu derste size hızlıca bunu nasıl kolayca yapabileceğimizi anlatacağım.

Spring’teki veri kaynağı ayarları genelde bir Spring Bean ile yapılıyor, yada eğer siz Spring Boot framework'u kullanıyorsanız, bunu application properties adlı bir dosya içinde yapabilirsiniz.

Bu derste, hep beraber bu ayarların nasıl yapılması gerektiğini bakacağız.

MAVEN DEPENDENCIES

Öncelikle Maven ile bir spring boot uygulamayı oluşturalım, ve burda test için H2 veritabanını kullanacağız.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.sanalkurs</groupId>
	<artifactId>spring-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<name>spring-test</name>
	<description>Test için farklı veri kaynağı kullanmak</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

 

Spring-boot-starter-jpa, h2, ve spring-boot-starter-test gibi araçlar Maven centraldan otomatik bir şekilde indirmiş olduk. şimdi ayarlara bir göz atalım.

APPLİCATİON PROPERTİES DOSYASI

Normalde bir Spring Boot projesi oluşturulduğunda, otomatik olarak src/main/resources adılı bir kalsörün oluşuyor, ve bu klasör içinde application.properties adlı bir dosyayı görüyoruz. Bu dosyanın içinde yazmakta olduğunuz proje çalışırken olması gereken ayarlarını bellileyebilirsiniz, mesela veritabanın ayarları veya logların nasıl olması gerektiğini.

Eğer biz test için farklı ayarları kullanmak istersek, o zaman da bu application.properties'de ayarları test için gereksiz kılmamız gerekiyor. Bunu yapmak için aynı şeklinde src/test/resources adılı bir klasör oluşturalım ve yine bezer şeklinde bu klasör içine application.properties adılı bir dosya eklememiz gerek. Böylece test esnasında burdaki bellirlediğimiz ayarlar aktif hale gelecektir ve aynı şeklinde production ayarlarını bozmamış oluruz.

proje görünüm

Biz test için H2 bellek içi veritabanı kullanalım, genelde java dünyasında test için bu şekilde kullanılmaktadır.

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:memb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sanakurs
spring.datasource.password=sanakurs

Spring Boot burdaki ayarları otomatik olarak bir Spring Bean’e çevirecektir. Şimdi Spring JPA aracı ile çok basit bir veri entitiy ve depo oluşturalım:

package com.sanalkurs.springtest;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * spring-test Created by Şahbil on 03/12/2017. Sanalkurs sahbil@sanalkurs.com
 */
@Entity
public class Kullanici {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String adi;
    private String Soyad;

    public Long getId () {
        return id;
    }

    // Constructorlar, getterler, setterler
}

Repo:

package com.sanalkurs.springtest;

import org.springframework.data.jpa.repository.JpaRepository;

/**
 * spring-test Created by Şahbil on 03/12/2017. Sanalkurs sahbil@sanalkurs.com
 */
public interface KullaniciReposu extends JpaRepository<Kullanici, Long> {

}

Şimdi JUnit ile bu repoyu test edelim. Burda @SpringBootTest annotationı unutmayalım.

package com.sanalkurs.springtest;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringTestApplicationTests {

    @Autowired
    private KullaniciReposu kullaniciReposu;

	@Test
	public void yeni_kullaniciyi_eklemek() {
	    Kullanici kullanici = kullaniciReposu.save(new Kullanici());
	    Kullanici eklenenKullanici = kullaniciReposu.findOne(kullanici.getId());

	    assertNotNull(eklenenKullanici);
	    assertEquals(kullanici.getId(), eklenenKullanici.getId());
	}

}

Testi çalıştıralım:

Unit test sunucu

Testimiz başarılı oldu.

Biz bu derste basit bir şekide test ve production ayarlarını nasıl ayırtabileceğimizi gördük. Bir sonraki derste size daha farklı şeklinde ayarlama metodlarını anlatacağım.

Bu ders ile alakalı kodlara burdan erişebilirsiniz.

Kaynak: sahbil.com

Şahbil Uygur
1979 Doğu Türkistan doğumlu. 2011’de Hollanda’da Hogeschool Utrechtte HBO Informatica’yıbitirdi. 2012 -2016 Türkiye’de girişimci olarak çalıştı, şimdi Hollanda’da VX Company’de Java Developerolarak çalışıyor.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git