programing

@WebMvcTest를 사용하여 "최소 1개의 JPA 메타모델이 존재해야 합니다"를 가져옵니다.

stoneblock 2023. 3. 15. 17:48

@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에서SpringBootApplicationclass 대신 다음 작업을 수행합니다.

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