获取“必须至少存在一个 JPA 元模型”,并@WebMvcTest

我对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.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: At least one JPA metamodel must be present!
Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel must be present!

与大多数人发布此错误不同,我不想为此使用JPA。我是否尝试使用不正确?我怎样才能找到邀请JPA参加这个派对的春天的魔力?@WebMvcTest


答案 1

从类中删除任何 或,请改为执行以下操作:@EnableJpaRepositories@EntityScanSpringBootApplication

package com.tdk;

@SpringBootApplication
@Import({ApplicationConfig.class })
public class TdkApplication {

    public static void main(String[] args) {
        SpringApplication.run(TdkApplication.class, args);
    }
}

并将其放在单独的配置类中:

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 {

}

答案 2

我遇到了同样的问题。@WebMvcTest查找带有@SpringBootApplication注释的类(如果找不到,则在应用结构中的同一目录或更高级别目录中)。您可以阅读@https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-mvc-tests 的工作原理。

如果用 @SpringBootApplication 注释的类也具有 /@EnableJpaRepositories则会发生此错误@EntityScan。因为你有这些带有@SpringBootApplication注释,并且你正在嘲笑服务(所以实际上没有使用任何JPA)。我找到了一个解决方法,它可能不是最漂亮的,但对我有用。

将此类放在测试目录(根目录)中。@WebMvcTest将在实际的应用程序类之前找到此类。在本课程中,您不必添加@EnableJpaRepositories/@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
    }
}

希望这有帮助!


推荐