Моя система
- 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 заставила его игнорировать пользовательский модуль Джексона, поэтому я хотел бы знать, как решить эту проблему.Может быть, нет никаких проблем, но моя конфигурация неверна.Пожалуйста, дайте мне совет.Спасибо.