24.03.06

서린·2024년 3월 6일

혼자개발

목록 보기
62/82

어제는 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());
    }
}

✅ 테스트 성공

0개의 댓글