2013-10-21 18 views
7

Làm thế nào để giả lập Thread.sleep() với PowerMock?Làm thế nào để giả lập Thread.sleep() với PowerMock?

giao diện mẫu và lớp:

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

Vì Máy là giao diện, bạn có thể không tiêm một lớp ghi đè lên phương thức ngủ bằng cách thực hiện trống và kiểm tra qua giao diện không? –

Trả lời

9

này đã cho tôi một thời gian để tìm ra, vì vậy tôi trả lời câu hỏi của riêng tôi.

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

Điều này hữu ích. Tôi đã kết thúc bằng cách sử dụng một cái gì đó hơi khác nhau. Tôi sử dụng EasyMock thay cho Mockito.

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

Không cần sử dụng Thread.class trong @PrepareForTest.

+0

Cảm ơn bạn đã chia sẻ một cách khác với bộ công cụ khác. Điều này có thể hữu ích cho người khác. – kevinarpe

Các vấn đề liên quan