Не удается смоделировать вызов базы данных, обрабатываемый средой Spring JPA при написании тестового примера для класса контроллера - PullRequest
0 голосов
/ 27 сентября 2018

Spring MVC преобразует идентификатор из пути к соответствующему объекту, вызывая метод findById в JpaRepository.Например, см. Метод getVersionTree ().

public class Controller {
    @NonNull
    private final MyService service;

    @NonNull
    private final MyAssembler assembler;

    @GetMapping(path = VERSION_TREE_MAPPING, produces = MediaTypes.HAL_JSON_UTF8_VALUE)
    public HttpEntity<?> getVersionTree(@PathVariable("id") MappingDocument mappingDocument, Pageable pageable, PagedResourcesAssembler<VersionNode> pagedResourcesAssembler) {
        Page<VersionNode> versionNodes = service.getVersionTreeFor(mappingDocument, pageable);
        return new ResponseEntity<>(pagedResources, HttpStatus.OK);
    }

Во время тестирования SpringMVC выдает «Не удалось преобразовать значение типа« java.lang.String »в требуемый тип» com.rbc.dna.dtl.mappingdocument.MappingDocument».Я издеваюсь над методом jpaRepository.findById ().Тестовый код выглядит следующим образом:

   @Autowired
    private WebApplicationContext webApplicationContext;

    @MockBean
    private MyRepository repository;

    @Mock
    MyController controller;

    @MockBean
    private MyServiceImpl serviceImpl;

    @Test
    public void testMethod() throws Exception {
            MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(SecurityMockMvcConfigurers.springSecurity()).build();
            MappingDocument mappingDocumentl=MappingDocument.builder().id(17L).build();
            Mockito.when(repository.findById(17L)).thenReturn(Optional.of(mappingDocumentl));
            Mockito.when(serviceImpl.getVersionTreeFor(mappingDocument,pageable)).thenReturn(pagedResponse);

            mockMvc.perform(MockMvcRequestBuilders.get("/abc/17/def").param("page","0").param("size","20").contentType(MediaTypes.HAL_JSON_UTF8_VALUE)
                    .with(authentication(getOauthTestAuthentication()))
                    .sessionAttr("scopedTarget.oauth2ClientContext", getOauth2ClientContext()))
                    .andExpect(MockMvcResultMatchers.status().isOk())               .andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
    }

1 Ответ

0 голосов
/ 27 сентября 2018

Ваш контроллер покоя принимает @PathVariable("id") MappingDocument mappingDocument в качестве переменной на вашем пути, но в mockMvc.perform вы передаете простую строку / число или что-то, что не связывается с MappingDocument.

Попробуйте заменить

public HttpEntity<?> getVersionTree(@PathVariable("id") MappingDocument mappingDocument...

с

public HttpEntity<?> getVersionTree(@PathVariable("id") Long idMappingDocument, ...


Если вы хотите сохранить свой объект в @PathVariable, вам нужно изменить

@GetMapping(path = VERSION_TREE_MAPPING)

Чтобы проанализировать объект как PathVariable, вам необходимо иметь путь, представляющий свойство вашего объекта.

Например, если у вас есть

class Person {

    String name;

    String address;

    //getters and setters
}

и вам нужноопределите контроллер следующим образом:

@GetMapping(path = "/person/{name}/{address}", produces = MediaTypes.HAL_JSON_UTF8_VALUE)
public HttpEntity<?> getVersionTree(Person person) {

Где {name} и {address} должны связывать Person свойства

...