问题:
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创建即可:
-
MockMvcBuilders.webAppContextSetup(WebApplicationContext context):使用应用程序上下文来构建MockMVC,指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;更加接近集成测试,让Spring加载控制器以及依赖。
-
MockMvcBuilders.standaloneSetup(Object... controllers):手工创建并配置的控制器,通过参数指定一组控制器,这样就不需要从上下文获取了;更加接近单元测试,专注于单一控制器的测试。
网友评论