![](/img/trans.png)
[英]Parse ZonedDateTime.now() with DateTimeFormatter in Java
[英]Why ZonedDateTime.now() throws NoSuchMethodException while running test cases(using mockito)
最近我正在編寫 junit 測試用例,我遇到了 ZonedDateTime.now() 部分預期的工作,我們嘗試編寫測試用例的方法使用 DozerBeanMapper 來復制公共字段。 請通過下面的 go 更好地理解順便說一句,我使用 @Spy 作為 DozerBeanMapper 而不是 @Mock,因為 @Mock 為我提供了虛擬 Object,這在我最后斷言時遇到了麻煩。
class A {
@Autowired
DozerBeanMapper mapper;
Entity method(Request req) {
Entity ent = new Entity();
req.setCreatedOn(ZonedDateTime.now());
dozerMapper.map(req,ent);
return ent;
}
}
以上代碼拋出異常:
org.dozer.MappingException: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:261) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.DestBeanCreator.create(DestBeanCreator.java:65) ~[dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapCustomObject(MappingProcessor.java:489) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:446) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:342) [dozer-5.4.0.jar:na]
at org.dozer.MappingProcessor.mapField(MappingProcessor.java:288) [dozer-5.4.0.jar:na]
但是當我像下面這樣在 dozerMapper 映射之后更改和添加 setCreatedOn 時,它工作得很好,我知道這是正確的方法。
Class A {
@Autowired
DozerBeanMapper mapper;
Entity method(Request req){
Entity ent = new Entity();
dozerMapper.map(req,ent);
ent.setCreatedOn(ZonedDateTime.now());
return ent;
}
}
我的重點是為什么它不適用於第一種方法代碼?
下面是sudo測試方法
Class ATest {
@InjectMocks
A aService;
@Spy
DozerBeanMapper mapper;
@Test
void methodTest(){
aService.method(req);
}
}
我想要一個簡短的解釋,為什么第一個代碼不起作用?
因為 dozer 試圖在不知道如何創建ZonedDateTime
的實例的情況下,所以它應用通常的策略:
set
方法。 ZonedDateTime
沒有這些 - 制作一個的“公式”是調用.of(...)
或now()
或parse(...)
- 因此,失敗。
該異常意味着:“我試圖調用new ZonedDateTime()
但這不起作用,因為該構造函數不存在”。 在字節碼/JVM 級別,構造函數實際上是public static OwnType <init>(args) {}
- 它們是名稱為<init>
的“方法”。 因此, java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
。
這是由推土機的映射器基礎設施拋出的:它試圖從某個來源獲取一些數據並將其“映射”到ZonedDateTime
的實例中。
查看 dozer 文檔,了解如何提供執行此映射所需的功能。 也許這個要點就是你所需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.