2015-01-29 5 views
3

Я не понимаю, почему PowerMock делает это так.PowerMock с окончательным классом Система и статический метод currentTimeMillis

Тест-класса

public class Testimpl { 
    public long test() { 
     long a = System.currentTimeMillis(); 
     System.out.println("2: " + a); 
     return a; 
    } 
} 

Junit-класса

import static org.mockito.MockitoAnnotations.initMocks; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(System.class) 
public class TestimplTest { 

    @InjectMocks 
    Testimpl testimpl; 

    @Before 
    public void setUp() throws Exception { 
     initMocks(testimpl); 
     PowerMockito.mockStatic(System.class); 
    } 

    @Test 
    public void test() { 
     PowerMockito.when(System.currentTimeMillis()).thenReturn(12345l); 
     System.out.println("1: " + System.currentTimeMillis()); 
     long a = testimpl.test(); 
     System.out.println("3: " + a); 
    } 

} 

Выход:

1: 12345

2: 1422547577101

3: 1422547577101

Почему это работает PowerMock/Mockito правильно в классе JUnit TestimplTest и не в исследуемом классе Testimpl?

Я использую jUnit 4.11 и Mockito 1.9.5 с PowerMock 1.6.1.

Благодарим за помощь.

ответ

5

Аннотации @PrepareForTest должны иметь проверенный класс, чтобы правильно издеваться над методом System.currentTimeMillis(). Источник и больше информации о том, что: PowerMock wiki

С правильным класса @PrepareForTest аннотацию: @PrepareForTest(Testimpl.class), у меня есть ожидаемый результат:

1: 12345
2: 12345
3: 12345

+1

Awesome..Had же проблема.Работа для меня. – TheLion

+0

@ TheLion, вам удалось издеваться над 'System.currentTimeMillis'? Я читал https://github.com/powermock/powermock/wiki/PowerMock-Configuration, который по умолчанию PowerMock загружал все классы с помощью MockClassLoader. Класс загрузчик загружает и модифицирует все классы, кроме системных классов. Поэтому похоже, что мы не можем издеваться над статическими методами Java и должны писать обертки. Я написал один, и он работает: https://gist.github.com/MaksimDmitriev/202142b6345ae86a3fda7577390fb1bf. И этот https://gist.github.com/MaksimDmitriev/1ceea5c08abb5fa9dc485fce7f71f630 не делает –