2013-10-21 14 views
7

Nasıl PowerMock ile Thread.sleep() alay etmek?Nasıl PowerMock ile Thread.sleep() alay etmek?

Numune arayüzü ve sınıf:

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

Makine bir arabirim olduğundan, boş bir uygulama ile uyku yöntemini geçersiz kılan ve arabirim üzerinden sınama yapan bir sınıf enjekte edemez misiniz? –

cevap

9

Bu anlamaya biraz zaman aldı, bu yüzden kendi soruyu yanıtlarken.

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

Bu yardımcı oldu. Biraz farklı bir şey kullanarak bitirdim. Mockito yerine EasyMock kullanıyorum.

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

@PrepareForTest yılında Thread.class kullanmak gerek yok.

+0

Başka bir araç seti ile başka bir şekilde paylaştığınız için teşekkür ederiz. Bu başkalarına yardımcı olabilir. – kevinarpe

İlgili konular