JunitTest5 returns 源中的 Jackson ObjectMapper 不能为空

Jackson ObjectMapper in JunitTest5 returns source cannot be null

序言:我正在学习 Java (Spring) 与 TDD。我这里有一个正在进行的项目:

分支机构:https://github.com/sineverba/online-banking-backend/tree/add-controller

最后一次提交:https://github.com/sineverba/online-banking-backend/commit/69d643eb81748656200f007bedf213d9352b079a

我正在为 POST 调用引入测试(请参阅 add-controller 分支以获取当前工作状态)。

所以,在新控制器中我添加了 post 调用,在测试中我写了:

        var id = 1L;
        var transactionToSave = validBankAccountTransactionsEntity(new BigDecimal(99.99), "First Transaction");
        var savedTransaction = validBankAccountTransactionsEntity(id, new BigDecimal(99.99), "First Transaction");
        
        when(bankAccountTransactionsService.post(transactionToSave))
        .thenReturn(savedTransaction);
        
        mvc.perform(
                post("/api/v1/bank-account-transactions/")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsBytes(transactionToSave))
                )
        .andExpect(status().isCreated())
        .andExpect(jsonPath("$.id", is((int) id)))
        .andExpect(jsonPath("$.amount", is(transactionToSave.getAmount())));

我收到错误消息

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: source cannot be null

问题在于

[...]
objectMapper.writeValueAsBytes(transactionToSave)
[...]

特别是错误是

Caused by: java.lang.IllegalArgumentException: source cannot be null
    at org.modelmapper.internal.util.Assert.notNull(Assert.java:53)
    at org.modelmapper.ModelMapper.map(ModelMapper.java:404)
    at com.bitbank.controllers.v1.BankAccountTransactionsController.convertToDto(BankAccountTransactionsController.java:54)

所以,最后,似乎错误是由控制器的 post 方法调用的 convertToDto 方法引起的:return convertToDto(savedBankAccountTransactionsEntity);.

无法解释我的问题,我不知道如何解决。

我正在关注指南:https://www.mattianatali.it/come-sviluppare-rest-api-in-tdd-con-spring-boot/

你可以看到作者写了相同的代码(当然例子不同),大约一半的页面,你可以看到:

@Test
    void create_shouldSaveTheVehicle() throws Exception {
        var vehicleId = 1L;
        var vehicleToSave = aValidVehicle();

        when(vehicleService.save(vehicleToSave))
                .thenReturn(
                        vehicleToSave
                                .toBuilder()
                                .id(vehicleId)
                                .build()
                );

        mvc.perform(
                post("/api/v1/vehicles")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsBytes(vehicleToSave))
        )
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.id", is((int) vehicleId)))
                .andExpect(jsonPath("$.brand", is(vehicleToSave.getBrand())))
                .andExpect(jsonPath("$.model", is(vehicleToSave.getModel())))
                .andExpect(jsonPath("$.year", is(vehicleToSave.getYear())));
    }

我的问题在哪里? :(

谢谢。

==================

1 - 添加:如果我使用 Postman 并使用正文进行调用

{
    "amount": 100,
    "purpose": "Postman test"
}

有效。

你得到这个错误的原因是因为你的 Double getAmount() 方法覆盖了你默认的 Lombok 的 getter 并且当映射器试图将你的实体的 BigDecimal amount 映射到你的 DTO 的 [=12] =] 映射器未找到名称为 amountBigDecimal 属性。