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")
}
// 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
// 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(),
        )
    }
// java
@BeforeEach
    public void setUp() {
        service = new TodoService(repository);
        stub = todoStub();
    }

// kotlin
@BeforeEach
    fun setUp() {
        service = TodoService(repository)
    }
// 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)
    }