반응형
오늘은 28강, 29강을 들어보았다.
Service Test를 마무리하는 단계였다.
Mock Test 의 편리함과 속도차이를 느껴볼 수 있었다.
*PersonService.java
package com.fastcampus.javaallinone.project3.mycontact.service;
import com.fastcampus.javaallinone.project3.mycontact.controller.dto.PersonDto;
import com.fastcampus.javaallinone.project3.mycontact.domain.Person;
import com.fastcampus.javaallinone.project3.mycontact.repository.PersonRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Slf4j
public class PersonService {
@Autowired
private PersonRepository personRepository;
public List<Person> getPeopleByName(String name){
// List<Person> people = personRepository.findAll();
//
// return people.stream().filter(person -> person.getName().equals(name)).collect(Collectors.toList());
return personRepository.findByName(name);
}
@Transactional(readOnly = true)
public Person getPerson(Long id){
return personRepository.findById(id).orElse(null);
}
@Transactional
public void put(PersonDto personDto){
Person person = new Person();
person.set(personDto);
person.setName(personDto.getName());
personRepository.save(person);
}
@Transactional
public void modify(Long id, PersonDto personDto){
Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다."));
if(!person.getName().equals(personDto.getName())){
throw new RuntimeException("이름이 다릅니다.");
}
person.set(personDto);
personRepository.save(person);
}
@Transactional
public void modify(Long id, String name){
Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다."));
person.setName(name);
personRepository.save(person);
}
@Transactional
public void delete(Long id){
Person person = personRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 존재하지 않습니다."));
person.setDeleted(true);
personRepository.save(person);
}
}
*PersonServiceTest.java
package com.fastcampus.javaallinone.project3.mycontact.service;
import com.fastcampus.javaallinone.project3.mycontact.controller.dto.PersonDto;
import com.fastcampus.javaallinone.project3.mycontact.domain.Person;
import com.fastcampus.javaallinone.project3.mycontact.domain.dto.Birthday;
import com.fastcampus.javaallinone.project3.mycontact.repository.PersonRepository;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentMatcher;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class personServiceTest {
@InjectMocks //테스트의 대상이 되는 클래스에 붙여줌
private PersonService personService;
@Mock //이 클래스를 Mock으로 만들어서 위 클래스에 주입
private PersonRepository personRepository;
@Test
void getPeopleByName(){
when(personRepository.findByName("martin"))
.thenReturn(Lists.newArrayList(new Person("martin")));
List<Person> result = personService.getPeopleByName("martin");
assertThat(result.size()).isEqualTo(1);
assertThat(result.get(0).getName()).isEqualTo("martin");
}
@Test
void getPerson() {
when(personRepository.findById(1L))
.thenReturn(Optional.of(new Person("martin")));
Person person = personService.getPerson(1L);
assertThat(person.getName()).isEqualTo("martin");
}
@Test
void getPersonIfNotFound() {
when(personRepository.findById(1L))
.thenReturn(Optional.empty());
Person person = personService.getPerson(1L);
assertThat(person).isNull();
}
@Test
void put(){
personService.put(mockPersonDto());
//void 메서드를 mock 테스트 할 떄 사용
verify(personRepository, times(1)).save(argThat(new IsPersonWillBeInserted()));
}
@Test
void modifyPersonNotFound(){
when(personRepository.findById(1L))
.thenReturn(Optional.empty());
assertThrows(RuntimeException.class, () -> personService.modify(1L, mockPersonDto()));
}
@Test
void modifyIfNameIsDifferent(){
when(personRepository.findById(1L))
.thenReturn(Optional.of(new Person("tony")));
assertThrows(RuntimeException.class, () -> personService.modify(1L, mockPersonDto()));
}
@Test
void modify(){
when(personRepository.findById(1L))
.thenReturn(Optional.of(new Person("martin")));
personService.modify(1L, mockPersonDto());
verify(personRepository, times(1)).save(any(Person.class));
verify(personRepository, times(1)).save(argThat(new IsPersonWillBeUpdated()));
}
@Test
void modifyByNameIfPersonNotFound() {
when(personRepository.findById(1L))
.thenReturn(Optional.empty());
assertThrows(RuntimeException.class, () -> personService.modify(1L, "daniel"));
}
@Test
void modifyByName(){
when(personRepository.findById(1L))
.thenReturn(Optional.of(new Person("martin")));
personService.modify(1L, "daniel");
verify(personRepository, times(1)).save(argThat(new IsNameWillBeUpdated()));
}
@Test
void deleteIfPersonNotFound() {
when(personRepository.findById(1L))
.thenReturn(Optional.empty());
assertThrows(RuntimeException.class, () -> personService.delete(1L));
}
@Test
void delete() {
when(personRepository.findById(1L))
.thenReturn(Optional.of(new Person("martin")));
personService.delete(1L);
verify(personRepository, times(1)).save(argThat(new IsPersonWillBeDeleted()));
}
private PersonDto mockPersonDto(){
return PersonDto.of("martin", "programming", "판교", LocalDate.now(), "programmer", "010-1111-2222");
}
private static class IsPersonWillBeUpdated implements ArgumentMatcher<Person> {
@Override
public boolean matches(Person person) {
return equals(person.getName(), "martin")
&& equals(person.getAddress(), "판교")
&& equals(person.getHobby(), "programming")
&& equals(person.getBirthday(), Birthday.of(LocalDate.now()))
&& equals(person.getJob(), "programmer")
&& equals(person.getPhoneNumber(), "010-1111-2222");
}
private boolean equals(Object actual, Object expected){
return expected.equals(actual);
}
}
private static class IsPersonWillBeInserted implements ArgumentMatcher<Person> {
@Override
public boolean matches(Person person) {
return equals(person.getName(), "martin")
&& equals(person.getAddress(), "판교")
&& equals(person.getHobby(), "programming")
&& equals(person.getBirthday(), Birthday.of(LocalDate.now()))
&& equals(person.getJob(), "programmer")
&& equals(person.getPhoneNumber(), "010-1111-2222");
}
private boolean equals(Object actual, Object expected) {
return expected.equals(actual);
}
}
private static class IsNameWillBeUpdated implements ArgumentMatcher<Person>{
@Override
public boolean matches(Person person) {
return person.getName().equals("daniel");
}
}
private static class IsPersonWillBeDeleted implements ArgumentMatcher<Person> {
@Override
public boolean matches(Person person) {
return person.isDeleted();
}
}
}
패스트캠퍼스 강의: https://bit.ly/3ilMbIO
반응형
'언어공부 > JAVA&SPRING' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 40회차 미션 (0) | 2020.09.18 |
---|---|
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 39회차 미션 (0) | 2020.09.17 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 37회차 미션 (0) | 2020.09.15 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 36회차 미션 (0) | 2020.09.14 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 35회차 미션 (0) | 2020.09.13 |
댓글