Unit Testing 을 위해서 Repository를 Mock했는데 먹지를 않습니다.
1075
작성한 질문수 1
안녕하세요.
Unit Testing 을 처음 해보는데 일단 Service의 로직을 먼저 테스트하기 위해 Repository를 Mock해서 Service 내에 @InsertMocks 어노테이션을 걸어서 when 조건을 삽입했습니다.
이후 Service 내에서 findById(1L)을 실행하면 when문에서 걸어준대로 User 객체를 반환해야 한다고 생각했으나, 계속 Optional이 비어있다고 나오네요.
그래서 Service로 들어간것이 아니라 직접 Test 내에서 Repository를 불러본 결과 Mock가 문제없이 잘 되고 있었습니다. 제가 Configuration 한 것에 문제가 있는지 고견 부탁드립니다.
UserServiceTest
import com.politicia.coreservice.domain.User;
import com.politicia.coreservice.dto.request.UserRequestDto;
import com.politicia.coreservice.dto.response.UserResponseDto;
import com.politicia.coreservice.repository.UserRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@InjectMocks
UserServiceImpl userService;
@Mock
private UserRepository userRepository;
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
void testSignUp() {
//given
UserRequestDto newUser = UserRequestDto.builder()
.name("newUser")
.profilePic("https://profile.pic")
.nationality("korea")
.build();
User expectedUser = User.builder()
.id(1L)
.name("newUser")
.nationality("korea")
.profilePic("https://profile.pic")
.build();
UserResponseDto expectedUserDto = UserResponseDto.builder()
.id(1L)
.name("newUser")
.nationality("korea")
.profilePic("https://profile.pic")
.createdAt(expectedUser.getCreatedAt())
.updatedAt(expectedUser.getUpdatedAt())
.build();
when(userRepository.save(any(User.class))).thenReturn(expectedUser);
//when
UserResponseDto actualUser = userService.createUser(newUser);
// Verify
assertEquals(expectedUserDto, actualUser);
}
@Test
void testGetUser() {
//given
User user = User.builder()
.id(1L)
.name("user")
.nationality("korea")
.profilePic("profilePic")
.build();
List<User> userList = new ArrayList<>();
userList.add(user);
when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user));
UserResponseDto expectedUserDto = UserResponseDto.builder()
.id(1L)
.name("user")
.nationality("korea")
.profilePic("profilePic")
.createdAt(user.getCreatedAt())
.updatedAt(user.getUpdatedAt())
.build();
//when
UserResponseDto actualUserDto = userService.getUser(1L);
//then
Assertions.assertEquals(actualUserDto, expectedUserDto);
}
}
UserServiceImpl
package com.politicia.coreservice.service;
import com.politicia.coreservice.domain.User;
import com.politicia.coreservice.dto.request.UserRequestDto;
import com.politicia.coreservice.dto.response.UserResponseDto;
import com.politicia.coreservice.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Override
public UserResponseDto createUser(UserRequestDto userRequestDto) {
User user = userRequestDto.toEntity();
User newUser = userRepository.save(user);
return UserResponseDto.builder()
.id(newUser.getId())
.name(newUser.getName())
.nationality(newUser.getNationality())
.profilePic(newUser.getProfilePic())
.createdAt(newUser.getCreatedAt())
.updatedAt(newUser.getUpdatedAt())
.build();
}
@Override
public UserResponseDto getUser(Long userId) {
User foundUser = userRepository.findById(userId).get();
return UserResponseDto.builder()
.id(foundUser.getId())
.name(foundUser.getName())
.nationality(foundUser.getNationality())
.profilePic(foundUser.getProfilePic())
.createdAt(foundUser.getCreatedAt())
.updatedAt(foundUser.getUpdatedAt())
.build();
}
}에러문구

답변 1
1
스스로 해결해서 해결방법도 올립니다.
해보니까
@ExtendWith(MockExtend.class) 가 @BeforeEach에서 하는 초기화를 이미 해주네요..
초기화 구문을 없앴더니 정상적으로 테스트가 잘 됐습니다.
섹션3. 11 회원객체 다이어그램
0
14
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
19
1
강의 연장 요청
0
17
1
설정 정보 없이 임베디드 데이터베이스 생성
0
15
1
형 이번에 낸 책이랑 강의 내용에 차이가 있어?
1
36
1
형 나 몰래 책내면 모를 줄 알고?
1
29
1
OrderServiceTest 상문주문 테스트 시 update 쿼리 문의
0
21
1
N+1 관련해서 질문있습니다.
0
33
3
강의 중복 확인 요청
0
26
1
중복내용 제보?!
1
48
2
여러 파드 환경에서 단일 실행 보장 방식
0
28
2
패키지 구분에 대해 궁금한게 있습니다
0
27
2
Singleton 관련 질문입니다.
1
58
2
코드 자료
0
53
2
조회속도 개선에서 더 개선하는 방법이 궁금합니다.
0
44
2
servlet과 container에 대한 질문입니다
0
31
1
RepositoryTest의 패키지 위치가 domain인 이유
0
37
2
도메인 모델에서 관계와 규칙을 구분하는 방법
0
58
2
UserService, CertificationService 책임 분리 기준 질문
0
28
1
spring initialiser 어떤걸 선택해야될지 모르겠어요
0
43
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
60
2
Json 요청 처리
1
52
2
로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.
0
31
2
Build 관련 문제 (테스트 관련 문제)
0
44
2





