2013-10-21 7 views
7

PowerMock के साथ Thread.sleep() का नकल कैसे करें?PowerMock के साथ Thread.sleep() का नकल कैसे करें?

नमूना इंटरफेस और वर्ग:

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

मशीन एक इंटरफ़ेस है, क्या आप एक कक्षा को इंजेक्ट नहीं कर सकते हैं जो नींद विधि को ओवरराइड करता है और इंटरफ़ेस के माध्यम से परीक्षण करता है? –

उत्तर

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

यह सहायक था। मैंने थोड़ा अलग इस्तेमाल करके अंत किया। मैं मॉकिटो के बजाय 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(); 
    } 
} 

@PrepareForTest में Thread.class उपयोग करने के लिए कोई ज़रूरत नहीं।

+0

किसी अन्य टूलकिट के साथ एक और तरीका साझा करने के लिए धन्यवाद। यह दूसरों के लिए सहायक हो सकता है। – kevinarpe

संबंधित मुद्दे