@WebMvcTest를 사용하여 "최소 1개의 JPA 메타모델이 존재해야 합니다"를 가져옵니다.
Spring에 온 지 얼마 안 된 사람인데, 기본적인 통합 테스트를 몇 가지 하려고 합니다.@Controller
.
@RunWith(SpringRunner.class)
@WebMvcTest(DemoController.class)
public class DemoControllerIntegrationTests {
@Autowired
private MockMvc mvc;
@MockBean
private DemoService demoService;
@Test
public void index_shouldBeSuccessful() throws Exception {
mvc.perform(get("/home").accept(MediaType.TEXT_HTML)).andExpect(status().isOk());
}
}
하지만 나는 점점
java.displaces를 클릭합니다.InlawalStateException:Application Context를 로드하지 못했습니다.원인: org.springframework.콩류.빈크리에이션예외:이름이 'jpappingContext'인 콩을 만드는 동안 오류가 발생했습니다.init 메서드를 호출하지 못했습니다.네스트된 예외는 java.lang입니다.부정 인수예외:적어도 1개의 JPA 메타모델이 존재해야 합니다!원인: java.lang.부정 인수예외:적어도 1개의 JPA 메타모델이 존재해야 합니다!
대부분의 사람들이 이 에러를 투고하고 있는 것과 달리, 나는 이것에 JPA를 사용하고 싶지 않습니다.사용하려고 하는 건가요?@WebMvcTest
틀렸나요?이 파티에 JPA를 초대하는 봄의 마법은 어떻게 추적할 수 있을까요?
모두 제거@EnableJpaRepositories
또는@EntityScan
에서SpringBootApplication
class 대신 다음 작업을 수행합니다.
package com.tdk;
@SpringBootApplication
@Import({ApplicationConfig.class })
public class TdkApplication {
public static void main(String[] args) {
SpringApplication.run(TdkApplication.class, args);
}
}
다른 config 클래스에 저장합니다.
package com.tdk.config;
@Configuration
@EnableJpaRepositories(basePackages = "com.tdk.repositories")
@EntityScan(basePackages = "com.tdk.domain")
@EnableTransactionManagement
public class ApplicationConfig {
}
테스트 결과는 다음과 같습니다.
@RunWith(SpringRunner.class)
@WebAppConfiguration
@WebMvcTest
public class MockMvcTests {
}
저도 같은 문제가 있었어요.@WebMvcTest는 @SpringBootApplication으로 주석을 단 클래스를 찾습니다(찾지 못한 경우 앱 구조에서 같은 디렉토리 이상).https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ #boot-boot-boot-boot-applications-boot-applications-boot-autoconfigured-mvc-mvc-params에서 이 기능의 구조를 확인할 수 있습니다.
@SpringBootApplication에서 주석을 단 클래스에 @EntityScan /@EnableJpaRepository도 있는 경우 이 오류가 발생합니다.@SpringBootApplication에 이러한 주석이 있고 서비스를 조롱하고 있기 때문에(실제로 JPA를 사용하지 않습니다).나는 가장 예쁘지는 않을지 모르지만 나에게 맞는 해결책을 찾았다.
이 클래스를 테스트 디렉토리(root)에 배치합니다.@WebMvcTest는 실제 응용 프로그램 클래스보다 먼저 이 클래스를 찾습니다.이 클래스에서는 @EnableJpaReposities/@EntityScan을 추가할 필요가 없습니다.
@SpringBootApplication(scanBasePackageClasses = {
xxx.service.PackageMarker.class,
xxx.web.PackageMarker.class
})
public class Application {
}
그리고 당신의 테스트는 똑같아 보일 것입니다.
@RunWith(SpringRunner.class)
@WebMvcTest
@WithMockUser
public class ControllerIT {
@Autowired
private MockMvc mockMvc;
@MockBean
private Service service;
@Test
public void testName() throws Exception {
// when(service.xxx(any(xxx.class))).thenReturn(xxx);
// mockMvc.perform(post("/api/xxx")...
// some assertions
}
}
이게 도움이 됐으면 좋겠네요!
또는 테스트 케이스 내에 컨트롤러(및 그 의존관계)만을 포함한 커스텀컨피규레이션클래스를 정의하여 스프링이 이 콘텍스트를 사용하도록 강제할 수 있습니다.
주의해 주십시오.아직은MockMvc
테스트 케이스에 다른 장점이 있다면WebMvcTest
주석을 달았다.
@RunWith(SpringRunner.class)
@WebMvcTest(DemoController.class)
public class DemoControllerIntegrationTests {
@Autowired
private MockMvc mvc;
@MockBean
private DemoService demoService;
@Test
public void index_shouldBeSuccessful() throws Exception {
mvc.perform(get("/home").accept(MediaType.TEXT_HTML)).andExpect(status().isOk());
}
@Configuration
@ComponentScan(basePackageClasses = { DemoController.class })
public static class TestConf {}
@MockBean(JpaMetamodelMappingContext.class)
DemoControllerIntegrationTests
:
@RunWith(SpringRunner.class)
@WebMvcTest(DemoController.class)
@MockBean(JpaMetamodelMappingContext.class)
public class DemoControllerIntegrationTests {
...
}
테스트에서 데이터베이스를 사용하지 않았기 때문에 스프링에서는 이 예외가 발생합니다.JpaMetamodelMappingContext
이치노
하여 스프링을 경우@EntityScan
★★★★★★★★★★★★★★★★★」@EnableJpaRepositories
수 있어요.@WebMvcTest
츠키다
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class DemoControllerIntegrationTests {
@Autowired
private MockMvc mvc;
//...
}
자동 접속이 합니다.MockMvc
사용하세요.
언급URL : https://stackoverflow.com/questions/41250177/getting-at-least-one-jpa-metamodel-must-be-present-with-webmvctest
'programing' 카테고리의 다른 글
ArgumentError(인수가 너무 적음): 레일 4.04에서 format.json을 호출할 때 (0) | 2023.03.15 |
---|---|
React를 사용하여 입력값을 올바르게 검증하는 방법.JS? (0) | 2023.03.15 |
Spring/Spring Boot pom.xml에서 Java 버전을 지정하는 방법 (0) | 2023.03.15 |
Swagger JSON을 RAML/YAML로 변환 (0) | 2023.03.15 |
JSON을 반환하는 GET 요청은 기본적으로 허용되지 않는 이유는 무엇입니까? (0) | 2023.03.15 |