jUnit:找不到接口com.querydsl.core.types.Predicate

时间:2018-06-04 11:28:36

标签: spring junit mockito querydsl

我在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吗?

3 个答案:

答案 0 :(得分:2)

  1. 尝试在测试类注释上添加 @Import(QuerydslWebConfiguration.class) 。它将 com.querydsl.core.types.Predicate 的控制器参数解析器添加到Spring上下文中。

  2. 但是在遇到类似以下的异常之后:

    找不到接口org.springframework.data.domain.Pageable的主要或默认构造函数。

  3. 有注释,为这两个接口加载参数解析器。 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));
  }

}

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-mvc-test-server

答案 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之外,诸如@EnableWebMvcWebMvcConfigurer之类的内容还可能导致未使用Spring Boot的Web自动配置。

来源:Another SO AnswerSwagger Issue comment