2013-10-21 289 views
7

Thread.sleep()をPowerMockでモックする方法は?Thread.sleep()をPowerMockでモックする方法は?

サンプルインターフェースとクラス:

public interface Machine { 

    void sleep(long millis); 
} 

public class MachineImpl 
implements Machine { 

    private static final Logger logger = Logger.getLogger(MachineImpl.class); 

    @Override 
    public void sleep(long millis) { 
     try { 
      if (millis > 0) { 
       logger.trace(String.format("Try to sleep for %d millis...", millis)); 
       Thread.sleep(millis); 
      } 
     } 
     catch (InterruptedException e) { 
      logger.trace("Full exception", e); 
     } 
    } 
} 
+0

Machineはインターフェイスなので、sleepメソッドをオーバーライドするクラスを空の実装に挿入してインターフェイス経由でテストすることはできませんか? –

答えて

9

これは把握する私にしばらく時間がかかったので、私は自分の質問に答えるのです。

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

@RunWith(PowerMockRunner.class) // important 
@PrepareForTest(MachineImpl.class) // important: do not use Thread.class here 
public class MachineImplTest { 

    private MachineImpl classUnderTest; 

    @Before 
    public void beforeEachTest() { 
     classUnderTest = new MachineImpl(); 
    } 

    @Test 
    public void sleep_Pass() { 
     classUnderTest.sleep(0); 
     classUnderTest.sleep(-100); 
     classUnderTest.sleep(+100); 
    } 

    @Test 
    public void sleep_Pass2() { 
     // We do not want to mock all methods, only specific methods, such as Thread.sleep(). 
     // Use spy() instead of mockStatic(). 
     PowerMockito.spy(Thread.class); 

     // These two lines are tightly bound. 
     PowerMockito.doThrow(new InterruptedException()).when(Thread.class); 
     Thread.sleep(Mockito.anyLong()); 

     classUnderTest.sleep(0); 
     classUnderTest.sleep(-100); 
     classUnderTest.sleep(+100); 
    } 
} 
3

これは役に立ちました。少し違ったものを使ってしまいました。私はMockitoの代わりにEasyMockを使用します。

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClassUnderTest.class}) 
public class MyTest { 
    @Before 
    public void setUp() { 
     PowerMock.mockStatic(Thread.class, methods(Thread.class, "sleep")); 
     Thread.sleep(anyLong()); 
     EasyMock.expectLastCall().anyTimes(); 
    } 
} 

@PrepareForTestThread.classを使用する必要はありません。

+0

他のツールキットと別の方法で共有してくれてありがとう。これは他人に役立つかもしれません。 – kevinarpe

関連する問題