- build.gradle 에서 ninja-squad 의 springmockk 라이브러리를 추가해준다.
- 기존 mokito 기반의 테스트를 가능하게 해준다.
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
runtimeOnly("com.h2database:h2")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("com.ninja-squad:springmockk:3.1.1")
}
- ExtendWith : . → ::
- MockBean 을 통해 mocking 을 하고 있었지만, 코틀린에서는 MockkBean 을 사용한다.
- lateinit 을 사용하여 repository 를 선언해주어야 한다.
- 프레임워크단위에서 추후에 repository애 대해서 mocking 을 해준다.
- service 또한 같은 의미로 lateinit 을 사용해준다.
// java
@ExtendWith(SpringExtension.class)
public class TodoServiceTests {
@MockBean
private TodoRepository repository;
private TodoService service;
// kotlin
@ExtendWith(SpringExtension::class)
class TodoServiceTests {
@MockkBean
lateinit var repository: TodoRepository
lateinit var service: TodoService
- stub(test data)를 builder를 통해 만들던 것을 생성자를 통해 만들어 준다.
- by lazy를 통해 사용하는 시점에 초기화를 할 수 있게 해준다.
- 변수를 immutable 하게 가졀갈 수 있다는게 장점이다.
// java
private Todo stub;
public Todo todoStub() {
return Todo.builder()
.id(1L)
.title("테스트")
.description("테스트 상세")
.done(false)
.createdAt(LocalDateTime.now())
.updatedAt(LocalDateTime.now()).build();
}
// kotoin
val stub: Todo by lazy {
Todo(
id = 1,
title = "테스트",
description = "테스트 상세",
done = false,
createdAt = LocalDateTime.now(),
updatedAt = LocalDateTime.now(),
)
}
- beforeEach 에서는 service에 mocking 된 repository만 넣어준다.
// java
@BeforeEach
public void setUp() {
service = new TodoService(repository);
stub = todoStub();
}
// kotlin
@BeforeEach
fun setUp() {
service = TodoService(repository)
}
- 함수 명에서 띄어쓰기를 지원해준다.
- given(mockito) ⇒ every(springmockk)
- isNotNull : property 형태로 사용가능하다
// java
@Test
public void 한개의_TODO를_반환해야한다() {
// Given
given(repository.findById(1L)).willReturn(Optional.of(stub));
// When
Todo actual = service.findById(1L);
// Then
assertThat(actual).isNotNull();
assertThat(actual).isEqualTo(stub);
}
// kotlin
@Test
fun `한개의 TODO를 반환해야한다`() {
// Given
every { repository.findByIdOrNull(1L) } returns stub
// When
val actual = service.findById(1L)
// Then
assertThat(actual).isNotNull
assertThat(actual).isEqualTo(stub)
}