오늘 유난히 집중이 안됐던 하루ㅠㅠ
테스트 코드 과제를 제출하고, 해설 자료를 보는데 너무 좋은 것들이 있어서 좀 가져왔다. 테스트 코드를 작성하면서 정말 귀찮았던 포인트가 객체 생성 및 초기화였다. 그런데 이를 인터페이스에 미리 선언을 해놓고, 각 테스트 클래스에 구현을 해서 사용을 하니 정말 편해졌다.
public interface TestBase {
String SECOND_PREFIX = "second ";
Long TEST_USER_ID = 1L;
Long TEST_ANOTHER_USER_ID = 2L;
String TEST_USER_NAME = "username";
String TEST_USER_PASSWORD = "password";
String TEST_USER_PROFILE = "테스트 유저입니다.";
String TEST_USER_EMAIL = "test@email.com";
String TEST_USER_NICKNAME ="Nickname";
User TEST_USER = User.builder().username(TEST_USER_NAME).pwd(TEST_USER_PASSWORD)
.profile(TEST_USER_PROFILE).email(TEST_USER_EMAIL).nickname(TEST_USER_NICKNAME).build();
User ANOTHER_TEST_USER = User.builder().username(SECOND_PREFIX + TEST_USER_NAME).
pwd(SECOND_PREFIX + TEST_USER_PASSWORD).
profile(SECOND_PREFIX + TEST_USER_PROFILE).
email(SECOND_PREFIX + TEST_USER_EMAIL).
nickname(SECOND_PREFIX + TEST_USER_NICKNAME).build();
}
이런식으로 미리 유저 객체들을 만들어 놓았다. 마찬가지로 Menu 객체또한 미리 만들어 놓을 수 있었다. 이렇게 미리 필드값들을 상수화해서 만들어 놓고 사용을 하니 테스트 코드 가독성이 많이 올라갔다.
내가 이번 과제 내내 고민했던 객체 초기화에 대한 정답을 찾았다. 정답은 ReflectionTestUtils다. 해설 자료에서는 RequestDto들이 Setter를 가졌지만, id값과, 작성일, 수정일과 같이 db에 저장이 되면서 초기화가 되는 값들은 주입 시킬 수 없었다. 이를 해결하기 위해 ReflectionTestUtils를 사용하면 된다. 이는 test환경에서 더미데이터들의 필드값들을 주입할 수 있는 방식이다.
ReflectionTestUtils.setField(FIRST_MENU, "id", 1L);
이런 문법을 지켜주면 된다. 앞에는 설정할 객체를 넣어주고, 뒤에는 필드와 넣어줄 값을 넣어주면 된다.
오늘은 집중을 제대로 못해서 많이 공부를 못했다. 내일은 오늘 정리한 test 인터페이스를 이용해서 테스트 코드 refactor를 진행해봐야겠다. 또한 controller test를 어떻게 진행해야 하는지 더 파고들어보자.