2017-08-24 8 views
1

ロジックPowerMockito:未完のスタブが検出された(未完成スタブ例外)

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

モックコード

私は上記の機能のためのJUnitテストケースを記述しようとしています
@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)); 

} 

、例外「UnfinishedStubbingException」示されています。

私は他の回答を読んだが、それ以降もエラーの理由を理解できません。

+0

'LocalDateTime.of(2017,8,24,8,50,9)'の値を中間変数に格納し、その変数を 'thenReturn'パラメータとして渡すことができますか? – Berger

+0

'(...'のときにはメソッドがありません –

+0

@Berger It Worked! ありがとう! –

答えて

2

あなたの問題は、LocalDateTime静的メソッドを嘲笑すべきであることをPowerMockitoに通知した後で、LocalDateTime.of(2017, 8, 24, 8, 50, 9)メソッドを実行していることです。 PowerMockitoはスタッビングコールの途中で、嘲笑されたメソッドを操作しようとしています。他の人を嘲笑している途中で、嘲笑された方法を呼び出すことはできません。

この種のことを行う正しい方法は、LocalDateTimeを模倣するのではなく、模擬してClockにすることです。 LogicクラスのインスタンスはClockでなければなりません。LocalDateTime.now()の代わりにLocalDateTime.now(theClock)を使用できます。これにより、Logicクラスがもっとテスト可能になります。なぜなら、モックClockを注入できるからです。

これは実際にはPowerMockitoを必要としません。普通のMockitoはうまくいくでしょう。