2017-08-09 2 views
3

Mock ich möchte nur die now() von LocalDate mit PowerMock verspotten. Es scheint, dass es den thenReturn Wert ignoriert:Wie man nur LocalDate.now() mit PowerMock Mock

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

Testaufbau:

@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; 
    } 

Antwort

4

Sie sollten die Foo Klasse PrepareForTest:

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

Ich bin nicht sicher, wie spy verhält sich für statische Methoden, so dass ich lieber mockStatic verwenden:

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

Um den Code testbar zu machen und hängen nicht statische Methoden auf spöttische, könnten Sie auch Refactoring Ihren Code ein java.time.Clock zu verwenden:

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; 
    } 
} 

Wenn Sie keine Clock angeben, wird es das System des Standard verwenden (genau das, was die now() Methode, wenn ohne Parameter aufgerufen hat).

Dann erstellen Sie in Ihrem Test eine Clock, die immer das gleiche Datum zurückgeben und es an die Foo Klasse übergeben. In diesem Fall benötigen Sie nicht alle PowerMockito-Komponenten:

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()); 
    } 
} 
Verwandte Themen