2017-08-09 82 views
3

now()LocalDateのみをモックしたいのですが、PowerMockを使用してください。 thenReturn値を無視していているようです:PowerMockを使用してLocalDate.now()をモックする方法

java.lang.AssertionError: 
Expected :2008 
Actual :2017 

テストのセットアップ:

@PrepareForTest(LocalDate.class) 
@RunWith(PowerMockRunner.class) 
public class UserTest { 

    @Test 
    public void nowShouldReturnSameYear() throws Exception { 
     LocalDate expected = LocalDate.parse("2008-04-04"); 

     PowerMockito.spy(LocalDate.class); 
     when(LocalDate.now()).thenReturn(parse); 

     Foo foo = new Foo(); 
     assertEquals(expected.getYear(), foo.getRightNow().getYear()); 
    } 

Foo.java

public LocalDate getRightNow(){ 
     final LocalDate rightNow = LocalDate.now(); 
     return rightNow; 
    } 

答えて

4

あなたはFooクラスをPrepareForTest必要があります。

@PrepareForTest(Foo.class) 
@RunWith(PowerMockRunner.class) 
public class ... 

私は、静的メソッドのためにどのようにspy振る舞うか分からないので、私はmockStatic使用することを好む:コードをよりテスト可能にするためにと静的メソッドをモックに依存しない、あなたはまた、リファクタリングができ

PowerMockito.mockStatic(LocalDate.class); 
when(LocalDate.now()).... 

public class Foo { 

    private Clock clock; 

    public Foo() { 
     // use the system's default clock 
     this(Clock.systemDefaultZone()); 
    } 

    public Foo(Clock clock) { 
     // use a custom clock 
     this.clock = clock; 
    } 

    public LocalDate getRightNow() { 
     final LocalDate rightNow = LocalDate.now(this.clock); 
     return rightNow; 
    } 
} 

あなたがClockを指定しない場合、それは(パラメータなしで呼び出されたときnow()方法はない正確に何)システムのデフォルトを使用します:java.time.Clockを使用するようにコード。

次に、テストでは、常に同じ日付を返してFooクラスに渡すClockを作成します。この場合、PowerMockitoのすべてのものは必要ありません。

public class UserTest { 

    @Test 
    public void nowShouldReturnSameYear() throws Exception { 
     LocalDate parse = LocalDate.parse("2008-04-04"); 
     // create a fixed clock (it always return the same date, using the system's default timezone) 
     ZoneId zone = ZoneId.systemDefault(); 
     Clock clock = Clock.fixed(parse.atStartOfDay(zone).toInstant(), zone); 

     Foo foo = new Foo(clock); 
     assertEquals(parse.getYear(), foo.getRightNow().getYear()); 
    } 
} 
関連する問題