Github https://github.com/kdelay/Point-API-TDD
API 개발하면서 배운 점 작성하기
≣ 목차
질문 메모
- Controller 유저 id 유무에 따라서만 테스트 하면 되는지?
Controller 테스트
- controller 테스트는 http 계층을 다루기 때문에 integration test이다.
- 스프링에서 통합 테스트는 필요한 모든 빈을 포함하고 있는 Application Context를 실행한다.
- 특정 url 수신, 예외 반환 역할 bean 등 포함
1. controller가 해당 ur을 잘 listen 하는지 확인
- verifying http request matching
2. input이 원하는 java object로 serialization 되는지 확인
- verifying input deserializtion
3. input validation check 동작 확인
- verifying input validation
4. 예상한대로 비즈니스 로직이 불렸는지 확인
- verifying business logic calls
5. http 응답 본문에 json 형태의 유효한 값이 포함되어있는지 확인
- verifying output serialization
6. 예외 처리
- verifying exception handling
Service 테스트
단위 테스트를 위해 mock을 이용한다.
MockitoAnnotations.openMocks(this): @Mock, @Spy, @InjectMocks 필드 초기화 및 모의 객체 주입
@InjectMocks
private PointService pointService;
@Mock
private UserPointTable userPointTable;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
테스트 유저 추가
@BeforeEach
void setUp() {
//모의 객체 초기화
mocks = MockitoAnnotations.openMocks(this);
//테스트 유저 추가
when(userPointTable.selectById(1L)).thenReturn(new UserPoint(1L, 50L, System.currentTimeMillis()));
when(userPointTable.selectById(2L)).thenReturn(UserPoint.empty(2L));
when(userPointTable.insertOrUpdate(anyLong(), anyLong())).thenAnswer(invocation -> {
long id = invocation.getArgument(0);
long amount = invocation.getArgument(1);
return new UserPoint(id, amount, System.currentTimeMillis());
});
//아이디 유효성 테스트
isEmptyId();
isInvalidId();
}
Issue
'AutoCloseable' used without 'try'-with-resources statement
해결 방법
try-with-resources 문을 사용하여 openMocks를 호출하고, 테스트가 완료된 후에 자동으로 자원을 닫을 수 있습니다.
MockitoAnnotations.openMocks(this);가 AutoCloseable을 구현하고 있기 때문에 발생합니다.
이를 해결하기 위해 try-with-resources 문을 사용해야 합니다.
try-with-resources 문을 사용하면 자원을 자동으로 닫아주므로 더 안전한 코드를 작성할 수 있습니다.
private AutoCloseable mocks;
@BeforeEach
void setUp() {
//모의 객체 초기화
mocks = MockitoAnnotations.openMocks(this);
}
@AfterEach
void tearDown() throws Exception {
// 테스트가 끝난 후 자원 해제
mocks.close();
}
Annotation
@MockBean vs @Mock
@MockBean
- 주입된 빈을 테스트에서 Mock 객체로 대체할 수 있도록 한다.
- 실제 구현체 대신에 Mock 객체를 사용해서 의존성을 관리할 수 있다. 테스트의 격리성을 확보하고, 외부 요소에 의존하지 않고 테스트를 진행할 수 있다.
- 테스트 의존성을 관리하고, 외부 환경에 독립적으로 테스트를 진행할 수 있게 해준다.
요약
• @Mock: Mockito 라이브러리에서 제공하는 목 객체 생성용 애노테이션. 단위 테스트에서 사용.
• @MockBean: 스프링 테스트에서 사용되며, 스프링 애플리케이션 컨텍스트에서 실제 빈을 대체하는 목적으로 사용됨. 스프링의 @Autowired와 함께 사용됨.
@InjectsMock
- Mockito 라이브러리 제공 애노테이션
- 테스트 대상이 되는 클래스의 인스턴스를 생성할 때 의존하는 다른 객체들을 자동으로 주입할 때 유용하게 활용된다
'Project > Web | Server' 카테고리의 다른 글
사내 출퇴근 프로그램 API 개발 (0) | 2024.06.08 |
---|---|
나만의 웹 페이지 만들기 (0) | 2022.07.13 |
댓글