어제는 service와 restController의 junit test를 진행했는데,
오늘은 나머지인 controller와 domain에 대한 test를 해보려고 한다
Controller는 애플리케이션의 비즈니스 로직과 클라이언트의 요청을 연결하는 역할을 하기 때문에 동작이 안정적이고 예측 가능해야한다
domain은 주로 비즈니스 규칙을 정의하고 해당 규칙을 적용하는 역할이라서 비즈니스 규칙이 올바르게 구현되었는지를 검증하기 위해 테스트가 필요하다
테스트를 통해 비즈니스 로직의 일관성과 정확성을 확인할 수 있다
UserController의
회원가입 메소드
/**
* 회원가입 화면 뷰
* @param model
* @return
*/
@GetMapping("/user/sign-up-view")
public String signUpView(Model model) {
model.addAttribute("viewName", "user/signUp");
return "template/layout";
}
test코드
@Test
void signUpViewTest() {
// Given
UserController userController = new UserController();
Model model = new ConcurrentModel(); //ConcurrentModel을 생성하여 모델을 준비
// When
String viewName = userController.signUpView(model); //UserController 클래스의 signUpView 메소드를 호출 -> 메소드는 모델에 "viewName" 속성을 설정하고 "template/layout" 문자열을 반환
// Then
assertEquals("template/layout", viewName);
assertEquals("user/signUp", model.getAttribute("viewName"));
}
signUpView 메소드가 예상대로 동작하는지를 확인하고, 뷰 이름과 모델 속성이 올바르게 설정되는지를 검증
로그인 메소드
/**
* 로그인 화면 뷰
* @param model
* @return
*/
@TimeTrace
@GetMapping("/user/sign-in-view")
public String signInView(Model model) {
model.addAttribute("viewName", "user/signIn");
return "template/layout";
}
test 코드
@Test
void signInViewTest() {
// Given
UserController userController = new UserController();
Model model = new ConcurrentModel();
// When
String viewName = userController.signInView(model);
// Then
assertEquals("template/layout", viewName);
assertEquals("user/signIn", model.getAttribute("viewName"));
}
signInView 메소드가 예상대로 동작하는지를 확인하고, 뷰 이름과 모델 속성이 올바르게 설정되는지를 검증
로그아웃 메소드
/**
* 로그아웃
* @param session
* @return
*/
@RequestMapping("/user/sign-out")
public String signOut(HttpSession session) {
session.removeAttribute("userId");
session.removeAttribute("userName");
session.removeAttribute("userLoginId");
//로그인 화면으로 이동
return "redirect:/user/sign-in-view";
}
test 코드
class UserControllerTest {
private UserController userController;
private HttpSession session;
private RedirectAttributes redirectAttributes;
@BeforeEach
void setUp() {
userController = new UserController(); //UserController 객체를 생성하고
session = mock(HttpSession.class); // HttpSession 객체를 목 객체(mock object)로 대체하여
redirectAttributes = mock(RedirectAttributes.class); //테스트에 필요한 세션 동작을 시뮬레이션
}
@Test
void signOutTest() {
// Given : userId, userName, userLoginId 호출시에 testUserId, testUsrName, testUserLoginId를 반환하도록 설정
when(session.getAttribute("userId")).thenReturn("testUserId");
when(session.getAttribute("userName")).thenReturn("testUserName");
when(session.getAttribute("userLoginId")).thenReturn("testUserLoginId");
// When
String result = userController.signOut(session); // signOut 메소드를 호출
// Then : signOut 메소드가 세션에서 userId, userName, userLoginId속성을 제거하는지 검증
verify(session).removeAttribute("userId");
verify(session).removeAttribute("userName");
verify(session).removeAttribute("userLoginId");
assertEquals("redirect:/user/sign-in-view", result);
}
}
signOut 메소드가 예상대로 동작하는지를 확인하고, 세션 속성이 제거되고 올바른 리다이렉트 URL이 반환되는지를 검증
그다음 domain 테스트
Mountain
@Builder
@ToString
@Data
public class Mountain {
private int id;
private String mtName;
private String mtLocation;
private double mtHeight;
private BigDecimal mtLot;
private BigDecimal mtLat;
private Date createdAt;
private Date updatedAt;
}
test 코드
class MountainTest {
@Test
void testMountainBuilder() { //Mountain 클래스의 빌더(Builder)를 테스트
Mountain mountain = Mountain.builder()
.id(1)
.mtName("Mount Everest")
.mtLocation("Himalayas")
.mtHeight(8848.86)
.mtLot(new BigDecimal("27.9881"))
.mtLat(new BigDecimal("86.9250"))
.createdAt(new Date())
.updatedAt(new Date())
.build();
assertNotNull(mountain);
assertEquals(1, mountain.getId());
assertEquals("Mount Everest", mountain.getMtName());
assertEquals("Himalayas", mountain.getMtLocation());
assertEquals(8848.86, mountain.getMtHeight());
assertEquals(new BigDecimal("27.9881"), mountain.getMtLot());
assertEquals(new BigDecimal("86.9250"), mountain.getMtLat());
assertNotNull(mountain.getCreatedAt());
assertNotNull(mountain.getUpdatedAt());
}
@Test
void testToString() { // toString() 메소드가 NullPointerException 등의 예외를 발생시키지 않고, 유효한 문자열을 반환하는지를 검증
Mountain mountain = Mountain.builder()
.id(1)
.mtName("Mount Everest")
.mtLocation("Himalayas")
.mtHeight(8848.86)
.mtLot(new BigDecimal("27.9881"))
.mtLat(new BigDecimal("86.9250"))
.createdAt(new Date())
.updatedAt(new Date())
.build();
assertNotNull(mountain);
assertNotNull(mountain.toString());
}
}