인프런 커뮤니티 질문&답변

jeidiiy님의 프로필 이미지
jeidiiy

작성한 질문수

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

Account Delete 테스트 버그 수정(FK 제약 조건 해제)

순수 EntityManager vs Spring Data JPA 테스트

해결된 질문

작성

·

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

답변 1

1

최주호님의 프로필 이미지
최주호
지식공유자

테스트시에 메모리에 없어서 @Imoprt 해줘야 합니다

jeidiiy님의 프로필 이미지
jeidiiy

작성한 질문수

질문하기