問題:
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是用來構(gòu)造MockMvc的構(gòu)造器,其主要有兩個實現(xiàn):
StandaloneMockMvcBuilder和DefaultMockMvcBuilder,StandaloneMockMvcBuilder繼承了 DefaultMockMvcBuilder。
直接使用靜態(tài)工廠MockMvcBuilders創(chuàng)建即可:
MockMvcBuilders.webAppContextSetup(WebApplicationContext context):使用應用程序上下文來構(gòu)建MockMVC,指定WebApplicationContext,將會從該上下文獲取相應的控制器并得到相應的MockMvc;更加接近集成測試,讓Spring加載控制器以及依賴。
MockMvcBuilders.standaloneSetup(Object... controllers):手工創(chuàng)建并配置的控制器,通過參數(shù)指定一組控制器,這樣就不需要從上下文獲取了;更加接近單元測試,專注于單一控制器的測試。