현재 StudyService에 대한 테스트를 진행하려고 하지만
인스턴스 생성 시 디폴스 생성자가 없기 때문에 MemberService member, StudyRepository에 대한 변수를 넣을 방법이 없다.
(둘 다 interface이고 이것을 구현할 구현체가 없다.)
그렇다면 구현체를 일일이 만들어서 테스트를 진행해보자
더보기
MemberService memberService = new MemberService() {
@Override
public Optional<Member> findById(Long memberId) throws MemberNotFoundException {
return Optional.empty();
}
};
StudyRepository studyRepository = new StudyRepository() {
@Override
public List<Study> findAll() {
return null;
}
@Override
public List<Study> findAll(Sort sort) {
return null;
}
@Override
public List<Study> findAllById(Iterable<Long> iterable) {
return null;
}
@Override
public <S extends Study> List<S> saveAll(Iterable<S> iterable) {
return null;
}
@Override
public void flush() {
}
@Override
public <S extends Study> S saveAndFlush(S s) {
return null;
}
@Override
public void deleteInBatch(Iterable<Study> iterable) {
}
@Override
public void deleteAllInBatch() {
}
@Override
public Study getOne(Long aLong) {
return null;
}
@Override
public <S extends Study> List<S> findAll(Example<S> example) {
return null;
}
@Override
public <S extends Study> List<S> findAll(Example<S> example, Sort sort) {
return null;
}
@Override
public Page<Study> findAll(Pageable pageable) {
return null;
}
@Override
public <S extends Study> S save(S s) {
return null;
}
@Override
public Optional<Study> findById(Long aLong) {
return Optional.empty();
}
@Override
public boolean existsById(Long aLong) {
return false;
}
@Override
public long count() {
return 0;
}
@Override
public void deleteById(Long aLong) {
}
@Override
public void delete(Study study) {
}
@Override
public void deleteAll(Iterable<? extends Study> iterable) {
}
@Override
public void deleteAll() {
}
@Override
public <S extends Study> Optional<S> findOne(Example<S> example) {
return Optional.empty();
}
@Override
public <S extends Study> Page<S> findAll(Example<S> example, Pageable pageable) {
return null;
}
@Override
public <S extends Study> long count(Example<S> example) {
return 0;
}
@Override
public <S extends Study> boolean exists(Example<S> example) {
return false;
}
};
이것을 일일이 임의의 구현한 다음 파라미터로 넣어주어야 한다.
얼마나 비효율적인가?
이러한 일을 Mockito가 대신해준다.
두줄이면 Mock객체를 만들 수 있다.
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);
이것도 귀찮으면 애노테이션을 이용하는 방법이 있다.
Mock 객체를 여러 테스트에서 이용
- @ExtendWith와 @Mock 이용 (@Mock만 사용하면 인스턴스가 Null이 되므로 오류가 발생한다.)
@ExtendWith(MockitoExtension.class)
@Mock
MemberService memberService;
@Mock
StudyRepository studyRepository;
Mock 객체를 하나의 테스트에서 이용 (파라미터에 Mock 설정)
@Test
void createStudyService(@Mock MemberService memberService, @Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyRepository);
}
코드 참조
https://github.com/mike6321/PURE_JAVA/tree/master/HowToTest/inflearn-the-java-test
'Java > Test' 카테고리의 다른 글
(Test) Mock 객체 확인 (0) | 2020.01.05 |
---|---|
(Test) Mock 객체 Stubbing (0) | 2020.01.05 |
(Test) Mockito 란? (0) | 2020.01.01 |
(Test) JUit5 - JUnit4 Migration (0) | 2020.01.01 |
(Test) JUit5 확장모델 (0) | 2020.01.01 |