我在spring-application中有一个restcontroller,返回一个对象列表......
@GetMapping
@Override
public ResponseEntity readAll(@QuerydslPredicate(root = Entity.class) Predicate predicate, Pageable pageable){
...
}
如果我运行它,一切正常。我可以通过分页和谓词来过滤请求。但如果我运行junit测试,它就会失败......
@Test
public void readAllTest(){
MockMvcBuilders.standaloneSetup(*myController*)
.build().perform(MockMvcRequestBuilders.get(*myUri*)
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
)
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE));
}
获取以下错误消息... org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:找不到接口com.querydsl.core.types.Predicate的主要或默认构造函数
有人知道如何使用Pageable和Predicate来测试restcontroller吗?
答案 0 :(得分:2)
尝试在测试类注释上添加 @Import(QuerydslWebConfiguration.class) 。它将 com.querydsl.core.types.Predicate 的控制器参数解析器添加到Spring上下文中。
但是在遇到类似以下的异常之后:
找不到接口org.springframework.data.domain.Pageable的主要或默认构造函数。
有注释,为这两个接口加载参数解析器。 org.springframework.data.web.config.EnableSpringDataWebSupport
已针对您的测试课程进行了调整:
@RunWith(SpringRunner.class)
@WebMvcTest(*myController*.class)
@EnableSpringDataWebSupport
public class ControllerTest{
@Test
public void readAllTest(){
MockMvcBuilders.standaloneSetup(*myController*)
.build().perform(MockMvcRequestBuilders.get(*myUri*)
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
)
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE));
}
}
答案 1 :(得分:0)
就目前而言,您只需要使用ApplicationContext来设置嘲笑Mvc,例如
@RunWith(SpringRunner.class)
@SpringBootTest
public class ControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
@Test
public void readAllTest() throws Exception {
MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build()
.perform(MockMvcRequestBuilders.get("YOUR_URI")
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE));
}
}
答案 2 :(得分:0)
如果任何人不仅要面对测试,还要面对正常的应用程序运行,则可能是由于Spring Boot未配置Web应用程序。例如,我的项目有一个SwaggerConfig
扩展了WebMvcConfigurationSupport
:
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
// Docket bean
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
}
}
我删除了继承和手动资源处理程序,现在工作正常。
注意:除了WebMvcConfigurationSupport
之外,诸如@EnableWebMvc
和WebMvcConfigurer
之类的内容还可能导致未使用Spring Boot的Web自动配置。