2017-08-24 66 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会做得很好。