https://github.com/ozimov/embedded-redis
GitHub - ozimov/embedded-redis: Redis embedded server
Redis embedded server. Contribute to ozimov/embedded-redis development by creating an account on GitHub.
github.com
Embedded Redis를 사용하는 목적은 개발시에 실제 Redis 설치없이 Unit test를 작성하기 위함이다.
초기 Spring boot Redis dependency를 테스트 하기 위해서 Redis 설치를 하였지만 Unit test를 실제 Redis에 연결해서 할 수 없으니, Embedded Redis를 설치하였다.
2022.01.12 - [Infrastructure/redis] - Redis 설치하기 in kubernetes
Redis 설치하기 in kubernetes
$ helm install -f values.yaml my-release bitnami/redis $ helm repo add bitnami https://charts.bitnami.com/bitnami 현재 구현하고 있는 Service의 경우 Redis를 사용해야 하기 때문에 Redis는 local에 설..
corono.tistory.com
그럼 Embedded Redis를 이용한 Unit test는 어떻게 작성하는지 알아보자.
Embedded Redis를 Unit test에서 사용하는 범위는 Repository Test로 한정할 예정이다. Embedded Redis의 목적에 맞게 한정시킬 예정이다.Controller, Service의 Unit test는 Mockito를 이용하여 Mocking 해서 작성하면 된다.
Test 용 RedisConfiguration 추가
@TestConfiguration | |
public class TestRedisConfig { | |
private RedisServer redisServer; | |
public TestRedisConfig(RedisConfig redisConfig) { | |
this.redisServer = new RedisServer(redisConfig.getRedisPort()); | |
} | |
@PostConstruct | |
public void postConstruct() { | |
redisServer.start(); | |
} | |
@PreDestroy | |
public void preDestroy() { | |
redisServer.stop(); | |
} | |
} |
TestRedisConfig class는 Emnbedded Redis server를 Test가 시작할 때 start 시키고, Test가 완료될 때 stop 시킨다.
Application-test.yaml 생성
#redis | |
redis: | |
host: localhost | |
port: 30379 | |
database: 0 | |
password: | |
timeout: 60000 |
Test 용 appilcation-test.yaml을 만들고 Embedded Redis로 접속할 수 있는 정보를 입력하였다.
JwtTokenRepository.java 파일
이 파일은 현재까지 나의 프로젝트에서 작성된 JwtTokenRepository.java 파일이다. 기본적은 save(), getById(), delete()등의 Method는 기본적으로 생성이 되므로 포함되어 있지 않다.
package io.coolexplorer.session.repository; | |
import io.coolexplorer.session.model.JwtToken; | |
import org.springframework.data.repository.CrudRepository; | |
public interface JwtTokenRepository extends CrudRepository<JwtToken, String> { | |
JwtToken findJwtTokenByAccountId(Long accountId); | |
} |
JwtTokenRepositoryTest.java 파일
기본 CRUD에 대한 Unit test를 추가하였다.
package io.coolexplorer.session.repository; | |
import io.coolexplorer.session.config.TestRedisConfig; | |
import io.coolexplorer.session.model.JwtToken; | |
import io.coolexplorer.test.builder.TestJwtTokenBuilder; | |
import lombok.extern.slf4j.Slf4j; | |
import org.junit.jupiter.api.BeforeEach; | |
import org.junit.jupiter.api.DisplayName; | |
import org.junit.jupiter.api.Nested; | |
import org.junit.jupiter.api.Test; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.boot.test.context.SpringBootTest; | |
import org.springframework.test.context.TestPropertySource; | |
import java.util.UUID; | |
import static org.assertj.core.api.AssertionsForClassTypes.assertThat; | |
@Slf4j | |
@SpringBootTest(classes = TestRedisConfig.class) | |
@TestPropertySource(properties = "spring.config.location=classpath:application-test.yaml") | |
public class JwtTokenRepositoryTest { | |
@Autowired | |
private JwtTokenRepository jwtTokenRepository; | |
JwtToken defaultJwtToken; | |
@BeforeEach | |
void setUp() { | |
defaultJwtToken = TestJwtTokenBuilder.dummyJwtToken(TestJwtTokenBuilder.ID); | |
jwtTokenRepository.save(defaultJwtToken); | |
} | |
@Nested | |
@DisplayName("JwtToken Cache Creation") | |
class JwtTokenCreationTest { | |
@Test | |
@DisplayName("Success") | |
void testJwtTokenCacheCreate() { | |
String id = UUID.randomUUID().toString(); | |
JwtToken jwtToken = TestJwtTokenBuilder.dummyJwtToken(id); | |
JwtToken createdJwtToken = jwtTokenRepository.save(jwtToken); | |
assertThat(createdJwtToken.getJwtToken()).isNotNull().isEqualTo(jwtToken.getJwtToken()); | |
} | |
} | |
@Nested | |
@DisplayName("JwtToken Retrieve") | |
class JwtTokenRetrieveTest { | |
@Test | |
@DisplayName("Success with Id") | |
void testJwtTokenCacheRetrieve() { | |
JwtToken jwtToken = jwtTokenRepository.findById(TestJwtTokenBuilder.ID).orElse(null); | |
assertThat(jwtToken.getJwtToken()).isNotNull().isEqualTo(defaultJwtToken.getJwtToken()); | |
} | |
@Test | |
@DisplayName("Success with account id") | |
void testJwtTokenCacheRetrieveWithAccountId() { | |
JwtToken jwtToken = jwtTokenRepository.findJwtTokenByAccountId(TestJwtTokenBuilder.ACCOUNT_ID); | |
assertThat(jwtToken.getJwtToken()).isNotNull().isEqualTo(defaultJwtToken.getJwtToken()); | |
} | |
} | |
@Nested | |
@DisplayName("JwtToken Cache update") | |
class JwtTokenCacheUpdateTest { | |
@Test | |
@DisplayName("Success") | |
void testJwtTokenCacheUpdate() { | |
JwtToken temp = TestJwtTokenBuilder.dummyJwtToken(UUID.randomUUID().toString()); | |
jwtTokenRepository.save(temp); | |
String newToken = UUID.randomUUID().toString(); | |
temp.setJwtToken(newToken); | |
JwtToken updatedJwtToken = jwtTokenRepository.save(temp); | |
assertThat(updatedJwtToken.getJwtToken()).isNotNull().isEqualTo(newToken); | |
} | |
} | |
@Nested | |
@DisplayName("JwtToken Cache Deletion") | |
class JwtTokenCacheDeletionTest { | |
@Test | |
@DisplayName("Success") | |
void testJwtTokenCacheDeletionTest() { | |
String id = UUID.randomUUID().toString(); | |
JwtToken temp = TestJwtTokenBuilder.dummyJwtToken(id); | |
jwtTokenRepository.save(temp); | |
jwtTokenRepository.deleteById(id); | |
JwtToken jwtToken = jwtTokenRepository.findById(id).orElse(null); | |
assertThat(jwtToken).isNull(); | |
} | |
} | |
} |
TestJwtTokenBuilder.java 파일
Unit test를 작성하다보면 반복적으로 Dummy data를 생성하는 경우가 있다. Unit test가 가지는 불편함 중에 하나이다. 이 부분을 간단히 하기 위해서 별도의 Static Class를 만들어서 간단한 호출을 통해서 사용할 수 있도록 하였다.
package io.coolexplorer.test.builder; | |
import io.coolexplorer.session.model.JwtToken; | |
import java.util.UUID; | |
public class TestJwtTokenBuilder { | |
public static String ID = UUID.randomUUID().toString(); | |
public static Long ACCOUNT_ID = 1L; | |
public static String JWT_TOKEN = UUID.randomUUID().toString(); | |
public static Long EXPIRATION = 100L; | |
public static JwtToken dummyJwtToken() { | |
return new JwtToken() | |
.setAccountId(ACCOUNT_ID) | |
.setJwtToken(JWT_TOKEN); | |
} | |
public static JwtToken dummyJwtToken(String id) { | |
return dummyJwtToken() | |
.setId(id); | |
} | |
} |
'Java > Spring boot' 카테고리의 다른 글
Custom Validation Contraint 작성하기 (0) | 2022.01.22 |
---|---|
Spring boot Validation 설정하기 (0) | 2022.01.20 |
SLF4J: Class path contains multiple SLF4J bindings 해결 방법 (0) | 2022.01.17 |
Spring server용 Dockerfile 추가 및 실행 (0) | 2022.01.15 |
Open API Document (Swagger) 설정하기 (0) | 2022.01.15 |