- No bean named 'entityManagerFactory' available
멀티 모듈로 구성을 하면서 해당 문제가 발생했다.
말 그대로 entityManagerFactory 의 Bean 을 사용할 수 없다는 것이다.
moinda-core 패키지에서 JPA 의존성을 직접 사용하는 구조로 되어 있으며
moinda-api 패키지를 통해서 애플리케이션을 실행하는 구조이기 때문에 서버구동시에
moinda-core 패키지의 Entity 들을 전부 스캔하고 Bean 으로 등록을 해야한다.
애플리케이션 실행 패키지(moinda-api)의 클래스
@PropertySources({
@PropertySource("classpath:application-core.properties")
})
@EntityScan("com.social.moinda.core")
@EnableJpaRepositories("com.social.moinda.core")
@EnableJpaAuditing
@SpringBootApplication(scanBasePackages = "com.social.moinda")
public class MoindaApplication {
public static void main(String[] args) {
SpringApplication.run(MoindaApplication.class, args);
}
}
테스트 코드
class MemberApiControllerTest extends BaseApiConfig {
@MockBean
private MemberCommandService memberCommandService;
@DisplayName("회원가입 성공 테스트")
@Test
void signupSuccessTest() throws Exception {
MemberCreateDto createDto = new MemberCreateDto("user1@email.com", "하하", "12121212", "12121212");
mockMvc.perform(post(MEMBER_API_URL)
.contentType(MediaType.APPLICATION_JSON)
.content(toJson(createDto)))
.andExpect(status().isCreated());
assertThatNoException();
}
}
@WebMvcTest
public class BaseApiConfig {
@Autowired
protected MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
protected static final String MEMBER_API_URL = "/api/member";
protected String toJson(Object obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
@WebMvcTest 어노테이션은 Controller 계층을 테스트를 하는데 JPA 관련 Bean 을 로딩하지 않는다. entityManagerFactory 는 JPA 관련 Bean 들이 생성되어야 생성될 것이기 떄문에
Application 클래스에 선언해둔 어노테이션들은 테스트코드를 실행할 경우 사용대상이 되지 않는다..
따라서 해당 설정들을 따로 분리시켜서 Config로 선언하면 되더라..
@PropertySources({
@PropertySource("classpath:application-core.properties")
})
@EntityScan("com.social.moinda.core")
@EnableJpaRepositories("com.social.moinda.core")
@EnableJpaAuditing
@Configuration
public class JpaConfiguration {
}
@SpringBootApplication(scanBasePackages = "com.social.moinda")
public class MoindaApplication {
public static void main(String[] args) {
SpringApplication.run(MoindaApplication.class, args);
}
}