Kotlin JUnit Test
들어가면서
java 프로젝트를 kotlin으로 전환하면서 새로 알게되는 부분을 정리합니다.
- 중복되는 @Autowired는 constructor로 처리
- Integer나 String의 nullable 여부를 kotlin은 바로 알수 없기 때문에 getter에 명시적으로 선언해줘야된다.
- @NotNull or @Nullable
UserServiceTest.kt
package com.group.libraryapp.service.user
import com.group.libraryapp.domain.user.UserRepository
import com.group.libraryapp.dto.user.request.UserCreateRequest
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest
class UserServiceTest @Autowired constructor(
private val userRepository: UserRepository,
private val userService: UserService
){
@Test
fun saveUserTest(){
// given
val request = UserCreateRequest("송명진", null)
// when
userService.saveUser(request)
// then
val results = userRepository.findAll()
assertThat(results).hasSize(1)
assertThat(results[0].name).isEqualTo("송명진")
assertThat(results[0].age).isNull() //Integer의 null 여부를 kotlin에서 확인할 수 없음
}
}
User.java
package com.group.libraryapp.domain.user;
import com.group.libraryapp.domain.book.Book;
import com.group.libraryapp.domain.user.loanhistory.UserLoanHistory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.GenerationType.IDENTITY;
@Entity
public class User {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private Integer age;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private final List<UserLoanHistory> userLoanHistories = new ArrayList<>();
public User() {
}
public User(String name, Integer age) {
if (name.isBlank()) {
throw new IllegalArgumentException("이름은 비어 있을 수 없습니다");
}
this.name = name;
this.age = age;
}
public void updateName(String name) {
this.name = name;
}
public void loanBook(Book book) {
this.userLoanHistories.add(new UserLoanHistory(this, book.getName(), false));
}
public void returnBook(String bookName) {
UserLoanHistory targetHistory = this.userLoanHistories.stream()
.filter(history -> history.getBookName().equals(bookName))
.findFirst()
.orElseThrow();
targetHistory.doReturn();
}
@NotNull
public String getName() {
return name;
}
@Nullable
public Integer getAge() {
return age;
}
public Long getId() {
return id;
}
}