jUnit: No primary or default constructor found for interface com.querydsl.core.types.Predicate

问题:

  No primary or default constructor found for interface com.querydsl.core.types.Predicate

有问题的code:

MockMvc mockMvc;
@Before
public void setup() {
    mockMvc = MockMvcBuilders.standaloneSetup(new APIRoleResource(roleService)).build();
}

@Test
public void list() throws Exception {
    mockMvc.perform(get("/api/roles/")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk());
    assertThat(roleService.repository().count()).isNotZero();
}

解决方式一:

MockMvc webContextMockMvc;
@Before
public void setup() {
    /**
     * 通过上下文build mock
     */
    webContextMockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();

    mockMvc = MockMvcBuilders.standaloneSetup(new APIRoleResource(roleService)).build();
}
@Test
public void list() throws Exception {
//        mockMvc.perform(get("/api/roles/")
//                .accept(MediaType.APPLICATION_JSON))
//                .andExpect(status().isOk());
    webContextMockMvc.perform(MockMvcRequestBuilders.get("/api/roles/")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk());
    assertThat(roleService.repository().count()).isNotZero();
}

MockMvcBuilder

MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:

StandaloneMockMvcBuilder和DefaultMockMvcBuilder,StandaloneMockMvcBuilder继承了 DefaultMockMvcBuilder。

直接使用静态工厂MockMvcBuilders创建即可:
  1. MockMvcBuilders.webAppContextSetup(WebApplicationContext context):使用应用程序上下文来构建MockMVC,指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;更加接近集成测试,让Spring加载控制器以及依赖。

  2. MockMvcBuilders.standaloneSetup(Object... controllers):手工创建并配置的控制器,通过参数指定一组控制器,这样就不需要从上下文获取了;更加接近单元测试,专注于单一控制器的测试。

参考

https://stackoverflow.com/questions/50679551/junit-no-primary-or-default-constructor-found-for-interface-com-querydsl-core-t

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。