Unit Testing 을 위해서 Repository를 Mock했는데 먹지를 않습니다.
1082
작성한 질문수 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에서 하는 초기화를 이미 해주네요..
초기화 구문을 없앴더니 정상적으로 테스트가 잘 됐습니다.
강사님 질문 있어요.
0
22
2
RestTemplate과 webClient, RestClient에 대해서 질문드립니다.
0
25
2
회원 도메인 인터페이스 개발
0
31
1
setter 사용하지 않기
0
36
1
세션을 제대로 이해한게 맞는지 궁금합니다
0
23
1
jsp의 상대경로와 Controller에서 반환하는 이름이 달라도 괜찮나요?
0
26
1
안녕하세요 토비님 혹시 완성된 코드의 repository 주소는 없을까요?
0
44
2
자막 오타 제보
0
38
1
운영환경에 적용해볼 수 없을때...고민입니다 ㅠㅠ
0
42
1
빈 스코프 개념의 중요성
0
29
1
트랙잭션 격리수준 선택에 대해서 질문
0
31
1
안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..
0
34
2
실무 내용 문의드려요
0
32
2
SingletonService가 JVM이 뜰 때 생성되는게 맞나요?
0
77
2
임포트 오류
0
42
2
답을언제쯤받아볼수있나요
0
74
2
형 책 어떻게 받아?
1
75
1
@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.
0
52
3
mvc 패턴 - 적용 강의에서 회원가입할 때 redirect가 아닌 forward인 이유가 궁금합니다.
0
38
1
프로젝트가 없어요..
0
78
2
JpaCursorItemReader의 정렬 조건 부재의 영향
1
55
2
changeTeam 메서드 질문
0
41
1
"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션
1
60
2
테스트 관련 질문!
0
67
2





