@RunWith(SpringRunner.class)
@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Test
public void findByEmail() {
String email="test1@test.com";
String name="test";
//given
userRepository.save(User.builder()
.email(email)
.password(passwordEncoder.encode("test1111"))
.name(name)
.roles(Collections.singletonList("ROLE_USER"))
.build());
//when
Optional<User> user=userRepository.findByEmail(email);
//then
assertNotNull(user);
assertTrue(user.isPresent());
assertEquals(user.get().getName(),name);
}
}
//given
UserRepository를 통해 userEntity를 save 가 주어졌을때
//when
findByemail을 하면
//then
찾은 user와 기존 userEntity 와 값이 같은지 확인했다
@RunWith(SpringRunner.class)는 @Mock 과 @Autowired등의 기능을 JUnit에서 사용할 수 있도록 해주는 브릿지이다.
JPA 관련 테스트 설정만 로드하는 어노테이션이다.
Datasource / Jpa 가 정상적으로 동작하는지 알아볼 수 있다.
실제 데이터베이스를 사용하지 않고 내장용 데이터베이스를 사용하여 테스트 해볼 수 있다.
자동으로 의존성 삽입
객체의 Null여부 테스트
참/거짓 테스트
두 값이 같은지 테스트
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
public class SignControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private ObjectMapper objectMapper;
@Autowired
private ModelMapper modelMapper;
@Before
public void setUp() throws Exception {
userRepository.save(User.builder()
.id(1L)
.email("jifrozen@naver.com")
.name("문지언")
.password(passwordEncoder.encode("test1111"))
.phoneNo("010-1234-5678")
.joinDate(new Date())
.roles(Collections.singletonList("ROLE_USER"))
.build());
}
@Test
public void signin() throws Exception {
//given
String content = objectMapper.writeValueAsString(new LoginRequest("jifrozen@naver.com", "test1111"));
//when//then
mockMvc.perform(post("/auth/user")
.content(content)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print())
.andExpect(status().isOk());
}
@Test
public void signup() throws Exception {
//given
User user = User.builder()
.id(1L)
.email("jifrozen1@naver.com")
.name("문지언1")
.password("test2222")
.phoneNo("010-1234-1222")
.joinDate(new Date())
.roles(Collections.singletonList("ROLE_USER"))
.build();
UserDto userDto = modelMapper.map(user, UserDto.class);
Gson gson = new Gson();
String content = gson.toJson(userDto);
//when//then
mockMvc.perform(post("/auth/user/registeration")
.content(content)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print());
}
}
실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미한다.
주어진 url을 수행할 수 있는 환경을 구성한다.
GET POST PUT DELETE 다양한 method 처리 가능
@responsebody 값을 받는다.
검증 내용을 체크한다.
테스트 후 객체를 받을 수 잇다.
여기서 고민했던 부분이 @ResponseBody로 json 파일을 받아와야하는데 잘 안받아와져서 고민하다 Gson을 이용해 받아왔다.
만약 param으로 받아야한다면
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("email", "dd@dd.com");
params.add("password", "test1111");
mockMvc.perform(post("/signup")
.params(params))
이렇게 해주면 된다!
참고문서
https://webcoding-start.tistory.com/20
https://codevang.tistory.com/259
https://shinsunyoung.tistory.com/52