저희 회사는 테스트 코드를 짜지 않고 바로 개발을 진행하기 때문에 사실 코드가 많이 지저분하기도 하고.. 메서드가 너무 길어져서 다른 사람들 코드 보기가 너무 힘들어서 일단 나라도 깨끗하게 해보자 싶어서 클린코드 & TDD 기반 코드 작성을 위해 내용을 찾아보기 시작했슴다
JUnit 으로 단위테스트에 필요한 어노테이션, 각 역할들에 대해서 정리한 내용입니다.
@Test
public void UserRepositoryTest() {
// UserRepository mocking하고 count메서드가실행되면 모킹한값(111L)을 리턴한다
UserRepository localMockRepository = Mockito.mock(UserRepository.class);
Mockito.when(localMockRepository.count()).thenReturn(111L);
long userCount = localMockRepository.count();
Assert.assertEquals(111L, userCount);
Mockito.verify(localMockRepository).count();
}
@ExtendWith(MockitoExtension.class)
public class MockAnnotationUnitTest {
@Mock
UserRepository mockRepository;
@Test
public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() {
Mockito.when(mockRepository.count()).thenReturn(123L);
long userCount = mockRepository.count();
Assert.assertEquals(123L, userCount);
Mockito.verify(mockRepository).count();
}
}
@ExtendWith(SpringExtension.class) // JUnit5
public class MockBeanTest {
@MockBean
AccountRepository accountRepository;
@Autowired
ApplicationContext context;
@Test
public void AccountCountTest() {
Mockito.when(accountRepository.count()).thenReturn(123L);
AccountRepository accountRepo = context.getBean(AccountRepository.class);
long userCount = accountRepo.count();
Assertions.assertEquals(123L, userCount);
Mockito.verify(accountRepository).count();
}
}
@MockBean 으로 등록을 하면 애플리케이션 컨텍스트에 mocking 된 객체가 등록되고 해당 필드에 주입됨
Controller 부분만 단위테스트를 진행하기 때문에 Controller 에서 Service 를 호출하는 부분을 가짜 행동으로 바꾸기 위해 모킹 된 동작을 수행하도록 설정
@MockBean
private LogManageService LogManageService;
@Test
public void testService() {
Mockito.when(LogManageService.getAccessControlDetailLog(1))
.thenReturn(MPAccessControlLog.DetailLog.builder().build());
}