Тест контроллера покоя Spring Boot - PullRequest
0 голосов
/ 02 апреля 2019

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

My Serivce:

public LegalPerson insert(LegalPerson legalPerson) {
        legalPerson.setId(null);
        try {
            legalPerson = repository.save(legalPerson);
        } catch (DataIntegrityViolationException error) {
            throw new DataIntegrity("Error something***", error);
        }
        return legalPerson;
    }

 public LegalPerson modelToEntity(LegalPersonModel personModel) {
        return LegalPerson.builder()
                .active(personModel.getActive())
                .companyId(personModel.getCompanyId())
                .tradeName(personModel.getTradeName())
                .companyName(personModel.getCompanyName())
                .email(personModel.getEmail())
                .cnpj(personModel.getCnpj())
                .stateRegistration(personModel.getStateRegistration())
                .municipalRegistration(personModel.getMunicipalRegistration())
                .openingDate(personModel.getOpeningDate())
                .address(personModel.getAddress())
                .companyType(personModel.getCompanyType())
                .subsidiaries(personModel.getSubsidiaries())
                .phones(personModel.getPhones())
                .build();
    }

Мой контроллер покоя

@RestController
@RequestMapping(value = "/api/clients/lp")
public class LegalPersonResource {

/**other methods ***/
 @PostMapping
    public ResponseEntity<Void> insert(@Valid @RequestBody LegalPersonModel legalPersonModel) {
        var legalPerson = service.modelToEntity(legalPersonModel);
        legalPerson = service.insert(legalPerson);
        return ResponseEntity.created(ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                .buildAndExpand(legalPerson.getId()).toUri()).build();
    }

И мой тест

@Test
void insert() throws Exception {
 var mockLPM = new LegalPersonModel(true, 1L, "mockTrade", "mockCompanyName", "mockTest@com", "63.236.885/0001-42", "123455", "1234566", localDate, 1L, CompanyEnum.HEADOFFICE,subsidiaries, phones);
   var objason = new ObjectMapper();
   objason.writeValueAsString(mockLPM);
   var test = mvc.perform(MockMvcRequestBuilders.post("/api/clients/lp").contentType(MediaType.APPLICATION_JSON_UTF8_VALUE).content(String.valueOf(objason))).andReturn();

 int status = test.getResponse().getStatus();
 Assertions.assertEquals(201, status);
}

всегда возвращает статус 400. Что я делаю не так?

==== ОБНОВЛЕНИЕ: ====

Работало по частям.

Работало только сObjectMapper, и я должен изменить LocalDate на ноль, так как он превращает localDate в огромную строку:

"openingDate": {"year": 1955, "month": "OCTOBER", "monthValue": 10, "dayOfMonth": 25, "chronology": {"calendarType": "iso8601", "id" "}," era ":" CE "," dayOfYear ": 298," dayOfWeek ":" TUESDAY "," leapYear ": false}

И на самом деле мой json должен выглядеть так: "openingDate": "2019-04-02" например.

Таким образом, когда я изменяю localDate на null, он пропускает эту часть, но NullPointerException в этой части моего сервиса здесь:

var legalPerson = service.modelToEntity (legalPersonModel);

он распознает legalPersonModel, который мы только что передали с ObjectMapper,однако legalPerson всегда остается равным нулю, он не конвертируется.

Я пробовал некоторые вещи безуспешно.Что мне делать?

=== ОБНОВЛЕНИЕ 2 ===

Если в контроллере покоя, имеет:

 return ResponseEntity.created (ServletUriComponentsBuilder.fromCurrentRequest (). path ("/ {id}")
                .buildAndExpand (legalPerson.getId ()). toUri ()). build ();

вернет ноль.

Но если я переключусь на

return ResponseEntity.status (201) .build ();

, у меня будет зеленый тест.

Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 02 апреля 2019

Вы получите статус 400 Bad Request всякий раз, когда полезная нагрузка post ing является недопустимым типом - в вашем примере вы должны post полезную нагрузку, которую можно десериализовать в LegalPersonModel объект.

Вы можете опубликовать данные непосредственно в виде json строки

@Test
void insertAsJsonString() throws Exception {
    var mockLPM = new LegalPersonModel(true,
            1L,
            "mockTrade",
            "mockCompanyName",
            "mockTest@com",
            "63.236.885/0001-42",
            "123455",
            "1234566",
            localDate,
            1L,
            CompanyEnum.HEADOFFICE,
            subsidiaries,
            phones);

    var om = new ObjectMapper();

    var test = mvc.perform(
            MockMvcRequestBuilders
                    .post("/api/clients/lp")
                    .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                    .content(om.writeValueAsString(mockLPM))
            .andReturn();

    int status = test.getResponse().getStatus();
    Assertions.assertEquals(201, status);
}

Чтобы сериализовать LocalDate в формат yyyy-MM-dd, попробуйте настроить ObjectMapper следующим образом

ObjectMapper om = new ObjectMapper();
om.registerModule(new JavaTimeModule());
om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Возможно, вам придется импортировать jackson-datatype-jsr310.Используя maven, импортируйте его следующим образом:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.8</version>
</dependency>

Если var legalPerson = service.modelToEntity (legalPersonModel); всегда приводит к legalPerson, являющемуся null, даже если LocalDate сериализуется правильно, вам нужно обновить вопрос с помощьюкласс LegalPerson, включая шаблон builder.


Я не могу воспроизвести проблему «Обновление 2».

Учитывая данную конечную точку

@PostMapping
public ResponseEntity<Void> insert(@Valid @RequestBody LegalPersonModel legalPersonModel) {
    var legalPerson = service.modelToEntity(legalPersonModel);
    legalPerson = service.insert(legalPerson);
    return ResponseEntity.created(ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
            .buildAndExpand(legalPerson.getId()).toUri()).build();
}

Вернет следующее (с помощью инструмента командной строки curl)

$ curl -X POST -d @legalPersonModelMock 'http://localhost:8080/api/clients/lp'
< HTTP/1.1 201 
< Location: http://localhost:8080/api/clients/lp/1
< Content-Length: 0

Содержимое файла legalPersonModelMock представляет собой json представление var mockLPM = new LegalPersonModel(...).

Вашкод для service.insert(...) устанавливает legalPerson.setId(null);, вы уверены, что это не мешает с ответом?

...