Spring Legacy + Junit4 + AssertJ 사용하여 테스트 코드 작성하기 (2)
이번엔 서비스 테스트 코드를 작성해 보자.
참고 : 이전 글에 세팅 방법이 있다. Spring Legacy + Junit4 + AssertJ 사용하여 테스트 코드 작성하기
자 먼저 서비스단 코드를 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class TestService {
private final TestDao testDao;
@Autowired
public TestService(TestDao testDao) {
this.testDao = testDao;
}
public int service1() {
int result = testDao.getTotalCount();
return result * 2;
}
}
자 우리는 service1() 이라는 메서드를 테스트 할 것이다. service1() 메서드는 DB에서 전체 숫자를 가져와서 2배를 해주는 메서드다. 이를 위해서 testDao와 연관 관계를 맺었다.
이제 단위 테스트와 스프링을 이용해서 통합 테스트를 진행해보자.
1. 단위 테스트
먼저 TestServiceTest.java를 만들어 주자.
1
2
3
4
5
6
7
8
9
@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest {
@Test
public void service1Test() throws Exception {
//given
//when
//then
}
}
다음과 같이 뼈대를 잡았다. @RunWith(MockitoJUnitRunner.class) 을 사용한다.
이제 전체 코드를 작성해 보자. 먼저 DAO를 의존하니깐 @Mock 어노테이션을 이용해서 가짜 DAO를 만들고, 그 다음 @InjectMocks을 이용해서 TestService를 가져오면서 DAO를 심어준다.
1
2
3
4
5
public class TestServiceTest {
@Mock TestDao testDao;
@InjectMocks TestService testService;
...
}
그 다음 이제 service1() 메서드를 테스트 한다. 필요한 걸 적어보자.
testDao.getTotalCount()는 뭐가 나올지 모른다.- 그럼 가짜 값이 필요하다.
when().thenReturn()을 사용하자. service1()을 호출해서 값을 받자.assertThat().isEqualTo()를 사용해서 값을 검증하자.
이렇게 코드를 작성하면 될 거 같다.
1
2
3
4
5
6
7
8
9
10
@Test
public void service1Test() throws Exception {
//given
int totalCount = 10;
when(testDao.getTotalCount()).thenReturn(totalCount);
//when
int result = testService.service1();
//then
assertThat(result).isEqualTo(totalCount*2);
}
나는 다음과 같이 작성했다.
어쨋든 service1() 메서드는 totalCount를 2배 해주는 메서드 이기 때문에 내가 설정한 가짜 값을 2배 한 값과 일치하면 된다.

결과를 보면 깔끔하게 통과한 걸 볼 수 있다.
2. Spring을 사용한 통합(?) 테스트
이젠 Spring을 사용해서 DAO에서 직접 값을 가져와서 service1() 메서드를 테스트 해보자
먼저 뼈대를 잡자. TestServiceTestWithSpring.java를 만들겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:spring/root-context.xml", "classpath*:spring/appServlet/*.xml"})
@WebAppConfiguration
public class TestServiceTestWithSpring {
@Autowired TestService testService;
@Test
public void service1Test() throws Exception {
//given
//when
//then
}
}
컨트롤러 테스트 때와 마찬가지로 @RunWith(SpringJUnit4ClassRunner.class), @ContextConfiguration, @WebAppConfiguration어노테이션을 사용한다.
그 후 @Autowired TestService testService;로 서비스를 테스트 해보자.
//given에선 줄 게 없다. 줄 게 있으면 여기서 세팅을 하자.//when에선service1()메서드를 실행하자.//then에선service1()에서 가져온 값을 검증 하자.
참고로 testDAO에서 getTotalCount() 메소드는 다음과 같다.
1
2
3
4
5
6
@Repository
public class TestDao {
public int getTotalCount() {
return 10;
}
}
10을 리턴 해주고 있다. (원래라면 DB 값을 가져온다.)
이제 test 코드를 작성하면
1
2
3
4
5
6
7
8
@Test
public void service1Test() throws Exception {
//given
//when
int result = testService.service1();
//then
assertThat(result).isEqualTo(20);
}
DB에서 10을 주기로 했고, 2배 해준 20을 검증해 보면 된다. 더 정확히 하고 싶으면 getTotalCount를 따로 실행해서 미리 변수로 빼놓고 예상 값에 x2 해주면 될 거 같다. 아무튼 실행해보면

잘 통과 된 걸 볼 수 있다.
그런데 스프링을 이용해서 테스트 한 코드는 무슨 실행할 때 6초나 걸린다. 이는 스프링을 먼저 올려 놓고 그 다음에 테스트를 작동하므로 스프링 올린 시간이 포함 돼서 그런 것 같다.
아무튼 서비스단도 단위 테스트 및 Spring을 사용한 통합 테스트도 진행해 보았다.
댓글남기기