Тестирование настраиваемого RepositoryRestController, который использует PersistentEntityResourceAssembler

У меня есть RepositoryRestController, который предоставляет ресурсы для некоторых постоянных сущностей.

У меня есть метод на моем контроллере, который использует PersistentEntityResourceAssembler, чтобы помочь мне автоматически генерировать ресурсы.

@RepositoryRestController
@ExposesResourceFor(Customer.class)
@RequestMapping("/api/customers")
public class CustomerController {

    @Autowired
    private CustomerService service;

    @RequestMapping(method = GET, value="current")
    public ResponseEntity getCurrent(Principal principal Long id, PersistentEntityResourceAssembler assembler) {
        return ResponseEntity.ok(assembler.toResource(service.getForPrincipal(principal)));
    }
}

(Надуманный пример, но он позволяет не вдаваться в подробности нерелевантных деталей моего варианта использования)

Я хотел бы написать тест для своего контроллера (мой реальный вариант использования действительно стоит протестировать), и я планирую использовать @WebMvcTest.

Итак, у меня есть следующий тестовый класс:

@RunWith(SpringRunner.class)
@WebMvcTest(CustomerController.class)
@AutoConfigureMockMvc(secure=false)
public class CustomerControllerTest {
    @Autowired
    private MockMvc client;

    @MockBean
    private CustomerService service;

    @Test
    public void testSomething() {
        // test stuff in here
    }

    @Configuration
    @Import(CustomerController.class)
    static class Config {
    }

}

Но я получаю исключение: java.lang.NoSuchMethodException: org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.<init>()

По-видимому, здесь что-то неправильно настроено, потому что мне не хватает всего уровня данных. Есть ли способ издеваться над PersistentEntityResourceAssembler? Или другой подход, который я мог бы здесь использовать?


person Martin    schedule 10.10.2017    source источник
comment
Что произойдет, если вы сделаете класс CustomerController общедоступным?   -  person Sam Brannen    schedule 11.10.2017
comment
Извините, это была ошибка C&P и не связана с этой проблемой (хотя и неплохой улов!). Проблема здесь в том, что весна видит, что ей нужно пройти PERA, но ее нет. Проблема почти наверняка в моей тестовой конфигурации.   -  person Martin    schedule 12.10.2017


Ответы (2)


В итоге я получил:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc

Недостатком этого является то, что тест запускает полный контекст приложения Spring (но без сервера).

person KLHauser    schedule 12.10.2017

Я закончил тем, что сделал здесь немного хакерское решение:

  • Я удалил PersistentEntityResourceAssembler из метода контроллера.
  • Я добавил @Autowired RepositoryEntityLinks к контроллеру, на котором я вызываю linkToSingleResource для создания ссылок по мере необходимости.
  • Я добавил @MockBean RepositoryEntityLinks в свой тестовый класс и настроил насмешку, чтобы вернуть что-то разумное:

    given(repositoryEntityLinks.linkToSingleResource(any(Identifiable.class)))
            .willAnswer(invocation -> {
                final Identifiable identifiable = (Identifiable) invocation.getArguments()[0];
                return new Link("/data/entity/" + identifiable.getId().toString());
            });
    

Это далеко не идеально - мне бы хотелось знать, есть ли способ получить ровно столько уровня данных, на которое я могу положиться PersistentEntityResourceAssembler.

person Martin    schedule 11.10.2017