Spring Restdocs Webtestclient игнорировать пользовательский модуль Джексона - PullRequest
0 голосов
/ 13 июня 2018

Моя система

  • spring-boot-version 2.0.1.RELEASE
  • spring-Cloud-Version Finchley.M9
  • java 1.8
  • org.springframework.boot: spring-boot-starter-webflux
  • org.javamoney: moneta: 1.2.1
  • org.springframework.restdocs: spring-restdocs-webtestclient

пользовательский SimpleModule

  @Bean
  public SimpleModule moneyModule() {
    return new MoneyModule();
  }

  public MoneyModule() {
      addSerializer(Money.class, new MoneySerializer());
      addValueInstantiator(Money.class, new MoneyInstantiator());
  }

Интеграционный тест

@RunWith(SpringRunner.class)
@ActiveProfiles("integTest")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class XxxxHandlerTest{
    @Autowired
  WebTestClient webTestClient;

  @Rule
  public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation();

  @Autowired
  ApplicationContext context;

  @Before
  public void init() throws Exception {
    this.webTestClient = WebTestClient.bindToApplicationContext(this.context)
        .configureClient()
        .baseUrl("http://local.com.cn")
        .filter(WebTestClientRestDocumentation
            .documentationConfiguration(this.restDocumentation)
            .operationPreprocessors()
            .withResponseDefaults(prettyPrint())
        )
        .build();
  }

  @Test
  public void testStoreVoucher() {
    Operator mockUser = Operator.builder().name("jack").id(ObjectId.get().toString()).build();
    List<AccountingEntry> accountingEntries = Arrays.asList(AccountingEntry.builder()
        .code("12121").summary("receipt").debit(Money.of(100, "CNY"))
        .credit(Money.of(100, "CNY")).build());
    VoucherPost voucherPost = VoucherPost.builder().operator(mockUser)
        .accountingEntries(accountingEntries).build();
    webTestClient.post()
        .uri(mockUrl)
        .body(BodyInserters.fromObject(voucherPost))
        .exchange().expectStatus().isOk();
}

ошибка теста

org.springframework.core.codec.DecodingException: JSON decoding error: Cannot construct instance of `org.javamoney.moneta.Money` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `org.javamoney.moneta.Money` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

Когда я удаляю следующий код , тестовый кодработает нормально

this.webTestClient = WebTestClient.bindToApplicationContext(this.context)
        .configureClient()
        .baseUrl("http://local.com.cn")
        .filter(WebTestClientRestDocumentation
            .documentationConfiguration(this.restDocumentation)
            .operationPreprocessors()
            .withResponseDefaults(prettyPrint())
        )
        .build();

Я думаю, что конфигурация webtestclient заставила его игнорировать пользовательский модуль Джексона, поэтому я хотел бы знать, как решить эту проблему.Может быть, нет никаких проблем, но моя конфигурация неверна.Пожалуйста, дайте мне совет.Спасибо.

1 Ответ

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

Поскольку вы используете Spring Boot, я бы рекомендовал использовать @AutoConfigureRestDocs вместо ручной настройки WebTestClient для использования REST Docs.Это самый простой способ получить WebTestClient, настроенный с помощью Jackson ObjectMapper, который будет использовать ваш пользовательский модуль.

Для этого ваш тестовый класс будет выглядеть примерно так:

@RunWith(SpringRunner.class)
@ActiveProfiles("integTest")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestDocs(uriHost="local.com.cn")
public class XxxxHandlerTest{

    @Autowired
    WebTestClient webTestClient;

    @Test
    public void testStoreVoucher() {
        Operator mockUser = Operator.builder().name("jack").id(ObjectId.get().toString()).build();
        List<AccountingEntry> accountingEntries = Arrays.asList(AccountingEntry.builder()
            .code("12121").summary("receipt").debit(Money.of(100, "CNY"))
            .credit(Money.of(100, "CNY")).build());
        VoucherPost voucherPost = VoucherPost.builder().operator(mockUser)
            .accountingEntries(accountingEntries).build();
        webTestClient.post()
            .uri(mockUrl)
            .body(BodyInserters.fromObject(voucherPost))
            .exchange().expectStatus().isOk();
    }

}
...