2017-08-24 72 views
1

邏輯PowerMockito:未完工磕碰檢測(未完成的成株異常)

public class Logic { 
String date = (LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); 
} 

模擬代碼

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ LocalDateTime.class }) 
public class LogicTest { 

@InjectMocks 
Logic target = new Logic(); 

PowerMockito.mockStatic(LocalDateTime.class); 
when(LocalDateTime.now()).thenReturn(LocalDateTime.of(2017, 8, 24, 8, 50, 9)); 

} 

當我試圖寫JUnit測試情況下,用於上述功能,異常「UnfinishedStubbingException」被顯示。

我讀了其他答案,但即使在那之後,我無法理解錯誤的原因。

+0

您可以嘗試將'LocalDateTime.of(2017,8,24,8,50,9)'的值存儲在中間變量中,並將該變量作爲'thenReturn'參數傳遞? – Berger

+0

有沒有方法'當(...' –

+0

@Berger它的工作! 謝謝! –

回答

2

您的問題是,您已通知PowerMockito LocalDateTime應該嘲笑靜態方法後,您正在運行方法LocalDateTime.of(2017, 8, 24, 8, 50, 9)。所以PowerMockito試圖在模擬方法上進行操作,而在一段殘酷的通話過程中。當你在嘲笑另一個時,你不能調用一個嘲弄的方法。

做這種事情的正確方法不是模擬LocalDateTime,而是模擬Clock。你的Logic類應該有一個你可以注入的實例Clock,然後你可以使用LocalDateTime.now(theClock)而不是LocalDateTime.now()。這使得Logic類更具可測性,因爲您可以注入您的模擬Clock

你實際上並不需要PowerMockito - 普通的Mockito會做得很好。