2016-04-28 6 views
0

Я попытался создать mock для java.time.ZonedDateTime, используя PowerMockito, и я ожидал макет объекта для ZonedDateTime. Вместо этого создается фактический объект, и поэтому я не могу издеваться над методами класса ZonedDateTime.Powermock не создает mock для java.time.ZonedDateTime

Ниже мой фрагмент кода

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

В дополнение к этому, когда я пытаюсь напечатать объект, созданный с помощью следующей строки System.out.println(attribute.toString());

я получаю следующее исключение:

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)

Может кто-нибудь, пожалуйста, помогите мне обходным путем? Должен ли я создать проблему 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(); 
} 

}

А в классе Test используется

@PrepareForTest(SomeClass.class) 

@RunWith(PowerMockRunner.class) 

В TestCase

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

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

PowerMockito.when(classUnderTest, "getCurrentLocalDateTime").thenReturn(tommorow); 
Смежные вопросы