java.time.LocalDateTime
を使用するユニットテストコードを試しています。私はモックを動かすことができますが、時間を追加すると(分または日のいずれか)、私はnull
という値になります。LocalDateTime.ofが返されます。
@RunWith(PowerMockRunner.class)
@PrepareForTest({ LocalDateTime.class })
public class LocalDateTimeMockTest
{
@Test
public void shouldCorrectlyCalculateTimeout()
{
// arrange
PowerMockito.mockStatic(LocalDateTime.class);
LocalDateTime fixedPointInTime = LocalDateTime.of(2017, 9, 11, 21, 28, 47);
BDDMockito.given(LocalDateTime.now()).willReturn(fixedPointInTime);
// act
LocalDateTime fixedTomorrow = LocalDateTime.now().plusDays(1); //shouldn't this have a NPE?
// assert
Assert.assertTrue(LocalDateTime.now() == fixedPointInTime); //Edit - both are Null
Assert.assertNotNull(fixedTomorrow); //Test fails here
Assert.assertEquals(12, fixedTomorrow.getDayOfMonth());
}
}
私はLocalDateTime
は不変であること(だけでなく、私は私がそう思う)を理解し、そして私は、新しいインスタンスの代わりに、null
値を取得すべきだと思うでしょう。
私にnull
の値を与えているのが.of
の方法です。どうして?
実行しようとしましたかモックなしのコード? powermockitoが問題を作り出している可能性があります。 – Ali
最初にPowerMock(ito)を使って再考することを検討してください;-) – GhostCat
Javaの「システム」クラス( 'java.time.LocalDateTime'など)を嘲笑するとき、PowerMockでは非システムクラス* '@ PrepareForTest'にリストされています(既に他の答えで指摘されているように)。しかし、私の経験では、このようなテストでの最大の間違いは、日付/タイムスタンプやシステムクロックを嘲笑するという考えを楽しませることさえあります。 SUTが 'LocalDateTime.now()'を使用している場合は、日付オブジェクトを(呼び出し側コードによって)外部から与えることが可能でなければなりません。そこに行って、それをしてください。 –