[ Spring ] Spring boot Test (@RunWith, @ExtendWith)
보통은 테스트 코드를 짜면서 코드를 짠다지만.. 사실 쉽지않다 ㅋㅋㅋㅋ
이번에도 코드를 짜고 그거 테스트하겠다고 테스트코드를 짜기 시작했는데 생각보다 많은걸 알게되어서 정리하는 용도로 쓴다.
내 경우는 MVC가 필요없는 간단한(?) 코드이므로 @SpringBootTest라는 거대한 아이를 쓰지 않는 방향으로 설계했다.
@SpringBootTest는 application을 띄우기때문에 통합테스트에 용이하지만 대신 시간도 오래걸리고 무겁기때문에 단위테스트하는데는 알맞지 않다(서버 올리는데 너무 오래걸려서 짜증났다).
해서 이번에 쓸 Test용 어노테이션은
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class) 이 두개가 되겠다
필요한 dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
DataServiceTests.java
package com.test.service;
//@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
class DataServiceTests {
@InjectMocks
private DataService service;
@Mock
private WpasDataMapper mapper;
@BeforeEach
public void setUp() {
System.out.println("setUp");
mockMapper();
service.initQcStepItem();
}
@Test
void test_InspectQcData() {
service.inspectQcData();
}
}
@RunWith(MockitoJUnitRunner.class)
Mockito의 Mock 객체를 사용하기 위한 Annotation이다
class 위에 달아준다
@ExtendWith(MockitoExtension.class)
Mockito의 Mock 객체를 사용하기 위한 Annotation이다
class 위에 달아준다
JUnit4에서는 RunWith(MockitoJUnitRunner.class)를,
JUnit5에서는 ExtendWith를 쓰도록 되어있다
@Mock
mock객체를 생성한다
@InjectMocks
생성한 Mock객체를 주입(inject)하여 사용할 수 있도록 만든 객체이다
쉽게 말하면 @InjectMocks에서 쓰는 객체를 @Mock으로 만들어 가져다 붙이는것
Service에 @InjectMocks를
mapper에 @Mock을 붙이면 실제로 mapper가 붙은것처럼 동일하게 사용할 수 있다
실제 Service 코드
DataService.java
@Service
@Slf4j
public class DataService {
@Autowired
private DataMapper mapper;
...
}
@BeforeEach
테스트 케이스 시작 전에 먼저 실행하는 어노테이션이다
직접 하나하나 넣어도 되지만 케이스가 많은 경우엔 이 어노테이션 하나로 끝낼 수 있다
보통 initialize용으로 많이 쓴다
테스트 실행시 setUp 로그가 테스트 마다 나오는 것을 확인 할 수 있다