해결된 질문
작성
·
636
·
수정됨
0
프로젝트를 하면서 궁금한 점이 생겨 질문드립니다.
@AutoConfigureMockMvc와 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) 만 적용한 상태로 테스트 코드를 작성했습니다. 그리고 @Autowired를 통해 순수 EntityManager를 주입받아서 직접 영속성을 관리하는 레포지토리가 있습니다. 그런데 직접 EntityManager를 주입받은 Repository 빈은 테스트 주입 시 EntityManager가 없다는 오류가 발생합니다. 하지만 Spring Data JPA의 JpaRepository를 상속받은 인터페이스를 @Autowired로 주입받으면 이는 문제없이 테스트가 동작합니다. 혹시 어떤 차이점이 있는지 알 수 있을까요?
@Repository
public class UserRepository {
@PersistenceContext
private EntityManager em;
public User save(final User user) {
em.persist(user);
return user;
}
public Optional<User> findByEmail(final String email) {
List<User> users = em.createQuery("select u from User u where u.email=:email", User.class)
.setParameter("email", email)
.getResultList();return users.isEmpty() ? Optional.empty() : Optional.of(users.get(0));
}
}
public interface UserJpaRepository extends JpaRepository<User, Long> {
public Optional<User> findByEmail(final String email);
}
@ActiveProfiles("test")
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class AjaxEmailPasswordAuthenticationFilterTests extends DummyObject {
@Autowired
private ObjectMapper objectMapper;
@Autowired
private MockMvc mockMvc;
@Autowired
private UserJpaRepository userJpaRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@BeforeEach
void setup() {
userJpaRepository.save(User.builder()
.email("test@gmail.com")
.username("test")
.password(passwordEncoder.encode("1234")).build());
}
@DisplayName("이메일 기반 회원가입 유저 로그인")
@Nested
class LoginByEmailTests {
@DisplayName("로그인 성공")
@Test
void success_test() throws Exception {
//given
String url = Endpoint.Api.LOGIN_WITH_EMAIL;
EmailLoginUserRequestDto requestDto = EmailLoginUserRequestDto.builder()
.email("test@gmail.com")
.password("1234")
.build();
//when
ResultActions resultActions = mockMvc.perform(
post(url)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(requestDto))
);
//then
resultActions
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").exists())
.andExpect(jsonPath("$.redirectUrl").exists());
}
}
}