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] =] 映射器未找到名称为 amount
的 BigDecimal
属性。
序言:我正在学习 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] =] 映射器未找到名称为 amount
的 BigDecimal
属性。