PowerMock使用詳解


1. PowerMock是什么?

PowerMock是一個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****************************/

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

}

 

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

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

/*****************************************************/

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM