2016-04-28 18 views
0

PowerMockitoを使用してjava.time.ZonedDateTimeのモックを作成しようとしましたが、私はZonedDateTimeのモックオブジェクトを期待していました。代わりに、実際のオブジェクトが作成されているので、私はZonedDateTimeクラスのメソッドを疑似できません。Powermockはjava.time.ZonedDateTimeのモックを作成しません

java.lang.NullPointerException at java.time.ZonedDateTime.toString(ZonedDateTime.java:2208) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:124) at org.powermock.core.MockGateway.methodCall(MockGateway.java:185)

:後

は、私は、オブジェクトを印刷しようとすると、私は例外 System.out.println(attribute.toString());

次取得するには、次の行を使用して作成した私のコードスニペット

これに加えて
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import java.time.ZonedDateTime; 
import java.time.format.DateTimeFormatter; 

import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.when; 
import static org.powermock.api.mockito.PowerMockito.mock; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ZonedDateTime.class}) 
public class ZonedDateTimeTest { 

    @Test 
    public void test(){ 
     ZonedDateTime attribute = mock(ZonedDateTime.class); 
     when(attribute.format(any(DateTimeFormatter.class))).thenReturn("dummy"); 
     //test code here 
    } 
} 

です

誰かがこの回避策を手伝ってもらえますか?私はGitHubの問題を作成する必要がありますか?

答えて

1

java.time.ZonedDateTimeは最終的なシステムクラスなので、workaroundを使用することによってのみモックできます。また、この回避策では、模擬システムクラスを使用するクラスを@PrepareForTestに追加する必要があります。 documentationに詳しい情報があります。

しかし、システムクラスをモックすることが可能な場合は、システムクラスをモックする必要がないようにコードをリファクタリングすることをお勧めします。クラスwhich you don't own.をモックすることはお勧めできません。意味のある方法でutilクラスを作成することができます。

0

public class SomeClass{ 

public static void main(String[] args) { 
    LocalDateTime now = getCurrentLocalDateTime(); 
    System.out.println(now); 
} 

private LocalDateTime getCurrentLocalDateTime() { 
    return LocalDateTime.now(); 
} 

}

とテストクラスであなたがテストケース

LocalDateTime tommorow= LocalDateTime.now().plusDays(1); 

SomeClass classUnderTest = PowerMockito.spy(new SomeClass()); 

PowerMockito.when(classUnderTest, "getCurrentLocalDateTime").thenReturn(tommorow); 

@PrepareForTest(SomeClass.class) 

@RunWith(PowerMockRunner.class) 

を使用するように、あなたのクラスのメソッドを作成します。