PowerMock使用詳解

1. PowerMock是什麼?

PowerMock是一個Java模擬框架,用於解決測試問題。java

舉個例子,你在使用Junit進行單元測試時,並不想讓測試數據進入數據庫,怎麼辦?這個時候就能夠使用PowerMock,攔截數據庫操做,並模擬返回參數。數據庫

2. PowerMock包引入

<!-- PowerMock JUnit 4.4+ Module -->
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>2.0.0</version>
  <scope>test</scope>
</dependency>
<!-- PowerMock Mockito2 API -->
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>2.0.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

3. 重要註解說明

@RunWith(PowerMockRunner.class) // 告訴JUnit使用PowerMockRunner進行測試
@PrepareForTest({RandomUtil.class}) // 全部須要測試的類列在此處,適用於模擬final類或有final, private, static, native方法的類
@PowerMockIgnore("javax.management.*") //爲了解決使用powermock後,提示classloader錯誤

 

4. 示例

4.1 普通Mock

/***********************Prepare****************************/api

public interface MockMapper {
  public int count(MockModel model);app

}框架

 

@Service
public class MockServiceImpl {
  @Autowired
  private MockMapper mockMapper;

  public int count(MockModel model) {
    return mockMapper.count(model);
  }
}dom

/*****************************************************/單元測試

@RunWith(PowerMockRunner.class) // 告訴JUnit使用PowerMockRunner進行測試
@PrepareForTest({MockUtil.class}) // 全部須要測試的類列在此處,適用於模擬final類或有final, private, static, native方法的類
@PowerMockIgnore("javax.management.*") //爲了解決使用powermock後,提示classloader錯誤
public class MockExample { // 將@Mock註解的示例注入進來
 @InjectMocks private MockServiceImpl mockService; @Mock private MockMapper mockMapper; /** * mock普通方法 */ @Test public void testSelectAppAdvertisementList() { MockModel model = new MockModel(); PowerMockito.when(mockMapper.count(model)).thenReturn(2); Assert.assertEquals(2, mockService.count(model)); } }

2. Mock靜態方法

/************************Prepare****************************/
public class MockUtil { private static final Random random = new Random(); public static int nextInt(int bound) { return random.nextInt(bound); } } /***************************************************/ 
@RunWith(PowerMockRunner.class) // 告訴JUnit使用PowerMockRunner進行測試
@PrepareForTest({MockUtil.class}) // 全部須要測試的類列在此處,適用於模擬final類或有final, private, static, native方法的類
@PowerMockIgnore("javax.management.*") //爲了解決使用powermock後,提示classloader錯誤
public class MockExample {
  @Test 
  public void testStaticMethod() {
    PowerMockito.mockStatic(MockUtil.
class);
    PowerMockito.when(MockUtil.nextInt(
10)).thenReturn(7);
    Assert.assertEquals(
7, MockUtil.nextInt(10));
  }
}

3. Mock方法內new出來的對象

/****************************************************/
public boolean makeFile(String path) { File file = new File(path); return file.exists(); } /****************************************************/ @RunWith(PowerMockRunner.class) // 告訴JUnit使用PowerMockRunner進行測試
@PrepareForTest({MockUtil.class, MockServiceImpl.class}) // 全部須要測試的類列在此處,適用於模擬final類或有final, private, static, native方法的類
@PowerMockIgnore("javax.management.*") //爲了解決使用powermock後,提示classloader錯誤
public class MockExample { // 將@Mock註解的示例注入進來
 @InjectMocks private MockServiceImpl mockService; @Test public void testNewObject() throws Exception { File file = PowerMockito.mock(File.class); PowerMockito.whenNew(File.class).withArguments("abc").thenReturn(file); PowerMockito.when(file.exists()).thenReturn(true); Assert.assertTrue(mockService.makeFile("abc")); } }
相關文章
相關標籤/搜索