Проблема сериализации SpringBoot при использовании TestRestTemplate - PullRequest
0 голосов
/ 11 июня 2018

У меня есть простой веб-контроллер для возврата сущности User.
У этой сущности есть свойство nonEditableProperty, которое не может быть обновлено.

Он отлично работает на веб-контроллере, значение nonEditableProperty указано в списке, но на UserControllerTest оно не работает, и возвращаемое значение всегда null.

Аннотация @JsonProperty(access = JsonProperty.Access.READ_ONLY), кажется, игнорируется во время сериализации теста.

У кого-нибудь есть подсказки по этой проблеме?
Стоит ли загружать какую-то конфигурацию Джексона для тестов?

@Getter
@Entity
class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String nonEditableProperty;

    User() {
    }

    public User(String name, String nonEditableProperty) {
        this.name = name;
        this.nonEditableProperty = nonEditableProperty;
    }

}

@RestController
@AllArgsConstructor
@RequestMapping("users")
public class UserController {

    private final UserRepository userRepository;

    @GetMapping
    public Collection<User> getAllUsers() {
        return (Collection<User>) userRepository.findAll();
    }

    @GetMapping(path = "/{id}")
    public User getUser(@PathVariable Integer id) {
        return userRepository.findOne(id);
    }

}


@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {

        @Autowired
        TestRestTemplate testRestTemplate;

        @Test
        public void getUserShouldReturnData() {

            ResponseEntity<User> response = testRestTemplate.getForEntity("/users/{id}", User.class, 1);
            assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);

            assertThat(response.getBody().getName()).isEqualTo("Muhammed Suiçmez");
            assertThat(response.getBody().getNonEditableProperty()).isEqualTo("Non editable property");

        }
    }

1 Ответ

0 голосов
/ 11 июня 2018

testRestTemplate.getForEntity(URI url, Class<T> responseType) Извлекает ответ API, нажимая url, а затем преобразует ответ в тип, заданный responseType

Хотя ответ API, полученный при нажатии URL, получил значение nonEditableProperty ( parse inputMessage.getBody здесь ), при десериализации его до responseType значение было потеряно из-за READ_ONLY свойства Джексона.

...