-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
Mockito 를 사용하여 테스트할 때, 테스트 요구사항의 반영 질문
21.10.19 18:24 작성 조회수 360
0
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Mock
MemberRepository memberRepository;
@Mock
ItemRepository itemRepository;
@Mock
OrderRepository orderRepository;
@InjectMocks
OrderService orderService;
@Test
@DisplayName("주문 성공")
void order() {
Member member = new Member(
1L,
"irostub",
new Address("seoul", "street", "10000"),
new ArrayList<>());
Item item = new Book(
1L,
"itemName",
15000,
2021,
new ArrayList<>(),
"5pg",
"isbn5100");
//given
given(memberRepository.findOne(anyLong()))
.willReturn(member);
given(itemRepository.findOne(anyLong()))
.willReturn(item);
//when
orderService.order(1L, 1L, 100);
//then
ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class);
then(orderRepository).should(times(1)).save(captor.capture());
}
}
코드는 위와 같습니다. 뭔가 많이 허전합니다. 강의에서 처럼 assertEqual()에 인자로 넣을 객체를 받아올 방법이 없어서 , orderRepository.save(...) 는 void를 반환하고 orderService.order(...) 은 Long 을 반환하지만 영속성 컨텍스트도 없으므로 null 을 반환합니다.
답변을 작성해보세요.
1
김영한
지식공유자2021.10.20
안녕하세요. irostub님^^
Mockito로 테스트를 시도하신 것은 잘 하신 것입니다. 그리고 생각하신 것 처럼 각각 단위를 나누어서 테스트하는 것이 맞습니다.
앞으로는 죄송하지만 질문 안내에 있는 것 처럼 학습에 관련된 질문을 올려주시길 부탁드립니다.
저도 마음으로는 도움을 드리고 싶지만, 하루에도 수 많은 분들이 질문을 올려주십니다. 그래서 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.
irostub
질문자2021.10.21
학습내용과 관계되지 않은 질문을 드렸음에도 답변을 주셔서 감사합니다. 반성하겠습니다 ㅜㅜ
아, 그리고 작성 방향이, 맞는 방향인지 아닌지 알려주셔서 감사합니다!
0
irostub
질문자2021.10.19
쓰면서 다시 한번 생각해봤는데,
Service 계층은 통합테스트를 하고
Domain은 Mockito 를 사용해서 createOrder 등의 메서드를 단위 테스트하면 되는건가? 라는 생각도 듭니다.
아니면 바라보는 시각이 잘못된걸까요?
OrderService 클래스의 입장에서 사실은
Order 의 주문시 상태가 ORDER 인지 아닌지,
주문한 상품 종류 수가 정확한지,
주문 가격은 가격 * 수량인지는
관심사가 아니여서 위에 질문과 같은 코드로 짜되 요구사항에 해당하는 관심사를 가진 클래스를 따로 단위테스트를 해주면 되는걸까요?
짜임새 있는 코드, 더 나은 코드를 짜보려고 생각하다보니 무지무지 어려워지는거같네요 ㅠㅠ
답변 2