簡體   English   中英

為什么 ZonedDateTime.now() 在運行測試用例時拋出 NoSuchMethodException(使用 mockito)

[英]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方法。
  • 調用無參數構造函數,直接設置字段。
  • 找到一個構造函數,它依次接受每個 arg 中的 1 個。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM