inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Unit Testing 을 위해서 Repository를 Mock했는데 먹지를 않습니다.

1093

YanyChoi

작성한 질문수 1

0

안녕하세요.

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();
    }
}

에러문구

Screenshot 2023-03-03 at 8.57.58 PM.png

spring 테스트

답변 1

1

YanyChoi

스스로 해결해서 해결방법도 올립니다.

해보니까

@ExtendWith(MockExtend.class) 가 @BeforeEach에서 하는 초기화를 이미 해주네요..

초기화 구문을 없앴더니 정상적으로 테스트가 잘 됐습니다.

섹션2, 대화&세션관리 수업 자료 누락

0

8

1

HelloSpringApplication.java 클래스 실행 오류

0

12

1

build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)

0

30

2

네이버 API | '검색 - 책' API 제공 중단

0

42

2

Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.

0

47

2

장치 의존성과 CSR

0

36

1

테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.

0

32

1

[영한님]Spring Boot 및 프로젝트 생성

0

56

2

JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문

0

55

3

강의 요청 문의

0

40

2

클로드코드 명령어-대화&세션관리 수업 자료

0

43

1

PlatformTransactionManager, ResourcelessTransactionManager 질문

1

68

2

자료 한번에 다운받기

0

33

1

스프링 빈 등록 방법 2가지 다 알아야하는 이유

0

59

1

mybatis 를 이용한 crud에서 insert에서 resultType='long" 이라고 하셨는데요,

0

27

1

설계 트레이드 오프 링크 접속 안됨

0

85

2

테스트 질문, 어떤것을 사용할것인것에 대해서

0

46

1

깃허브주소 궁금합니다.

0

36

2

mariaDB 설정

0

33

1

섹션4 퀴즈 오타있어요.

0

48

1

AWS 배포 성능테스트

0

75

2

퀴즈가 안열려요

0

76

2

7강 보고 있는데요.. 글자가 너무 작아요

0

43

1

트래잭션 전파 기본- 에 대한 개념 질문? 이렇게 생각해도 맞나요?

0

47

1