Как смоделировать пользовательский отклик Jackson Deserializer в Spring Boot 1.5.9 - PullRequest
0 голосов
/ 19 мая 2018

В проекте Spring Boot 1.5.9 в настоящее время я пытаюсь использовать @WebMvcTest для запуска теста на одном из моих контроллеров.Обрабатываемый объект имеет аннотацию @JsonDeserializer() к одному из своих свойств, указывающих на пользовательский класс.Я пытаюсь смоделировать результат вызова deserialize() в тесте без вызова тела.

Однако при попытке выполнить следующее я получаю сообщение об ошибке NullPointerException в строке внутри *Метод 1006 *, который предполагает, что выполняется фактическое тело метода:

@Autowired
private MockMvc mvc;
@MockBean
private MyDeserializer myDeserializer
[...]
@Test
public void myTestMethod() {
  doReturn(myDeserializedValue)
      .when(myDeserializer)
      .deserialize(
          any(JsonParser.class),
          any(DeserializationContext.class)
      );
  this.mvc.perform([...]) // perform mvc call that would invoke myDeserializer
  logger.debug("Call complete"); // never gets to this line
}

Я предполагаю, что пользовательский класс десериализатора вызывается (возможно, new ed вверх) вне знания Spring ApplicationContext.

Есть ли способ смоделировать собственный десериализатор, или мне нужно увеличить этот класс, чтобы использовать полный ApplicationContext через @SpringBootTest и позволить ему полностью выполнить?

1 Ответ

0 голосов
/ 19 мая 2018

Если вы хотите, чтобы Джексон использовал конкретный экземпляр объекта десериализатора, вам необходимо зарегистрировать его через модуль в экземпляре ObjectMapper.См. документы для примера с сериализатором;вам придется немного изменить его для своего десериализатора.

В противном случае, я предполагаю, что Джексон будет каждый раз просто создавать новый экземпляр вашего класса и никогда не использовать ваш макет (или бин?) вообще.

...