[Dining-together] Spring unit test (로그인 회원가입)

Jifrozen·2021년 5월 29일
0

Dining-together

목록 보기
5/25

Spring unit test (로그인 회원가입)

UserRepositoryTest

@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)

@RunWith(SpringRunner.class)는 @Mock 과 @Autowired등의 기능을 JUnit에서 사용할 수 있도록 해주는 브릿지이다.

@DataJpaTest

JPA 관련 테스트 설정만 로드하는 어노테이션이다.
Datasource / Jpa 가 정상적으로 동작하는지 알아볼 수 있다.
실제 데이터베이스를 사용하지 않고 내장용 데이터베이스를 사용하여 테스트 해볼 수 있다.

@Autowrired

자동으로 의존성 삽입

assertNotNull

객체의 Null여부 테스트

assertTrue Flase

참/거짓 테스트

assertEquals

두 값이 같은지 테스트


SignControllerTest

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

	}

}

MockMvc

실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미한다.

perform

주어진 url을 수행할 수 있는 환경을 구성한다.
GET POST PUT DELETE 다양한 method 처리 가능

content

@responsebody 값을 받는다.

andExpect

검증 내용을 체크한다.

andResult

테스트 후 객체를 받을 수 잇다.

여기서 고민했던 부분이 @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

0개의 댓글