Тестовый контроллер, который использует @QueryDsl Predicate и Page - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть контроллер, который аннотирован @RestController.Для запросов GET это реализовано так:

@GetMapping
public Map<String, Object> getFilteredCars(
      @QuerydslPredicate(root = Car.class) Predicate predicate,
      @RequestParam(name = "page", defaultValue = "0") int page,
      @RequestParam(name = "size", defaultValue = "150") int size
) {
    return this.carService.getFilteredCars(
            predicate,
            PageRequest.of(page, size)
    );
}

Контроллер работает нормально, я могу запрашивать различные параметры и получать страницу с определенным размером.

Теперь я хочу протестироватьконтроллер.

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
class CarControllerTest {

@Mock
private CarService carService;

@InjectMock
private CarController carController;

@BeforeEach
void init(){
    RestAssured.baseURI = "http://localhost";
    RestAssured.port = 8810;
}

@Test
void givenUrl_whenSuccessOnGetCarsAndReturnsPage_thenCorrect() {

   when(this.CarService.getFilteredCars(any(),any()))
       .thenReturn(expectedResponse);

    given()
        .standaloneSetup(new CarController(this.carService))
    .when()
        .get("/cars?color=red&page=0&size=200")
    .then()
        .statusCode(200);
}

Запуск этого дал мне исключение:

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

Как в этом вопрос Я добавил

@EnableSpringDataWebSupport 

Теперь яполучите новое исключение:

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: 
Invalid bean definition with name 'pageableResolver' defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]: 
Cannot register bean definition 
[Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; 
factoryMethodName=pageableResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]] for bean 'pageableResolver': 
There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration; 
factoryMethodName=pageableResolver; initMethodName=null; destroyMethodName=(inferred); 
defined in class path resource [org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.class]] bound.
...

Я не понимаю, что происходит.Есть у кого идея, как решить проблему?

...