測試靜態方法
說明
- 測試靜態方法需要其他 Library 來輔助,在這裡用了 PowerMock ,gradle 設定如下
testCompile 'org.powermock:powermock-module-junit4:1.6.2'
testCompile 'org.powermock:powermock-api-mockito:1.6.2'
範例
假設現在要實作一個發送驗證碼到電子信箱的功能,那麼程式碼可能會是如下:
public class VerificationPresenter {
private ServerModel serverModel;
private VerificationView view;
public void sendVerification(String email){
if(Utils.isEmail(email)){
serverModel.sendVerification(email, view);
}else{
view.showWarning();
}
}
}
在這裡呼叫了一個共用的靜態方法:isEmail。用來檢查電子信箱是否有效
在 Utils.isEmail 裡有很複雜的撿查邏輯。驗證這靜態方法的邏輯應該在 UtilsTest 裡完成,而不是在 VerificationPresenterTest。所以這裡所關注的只有:回傳是值 True 還是 False,以及相對應的行為。
目標
如果是有效的 Email,就送出驗證碼。反之則顯示警告。
開始測試
1. 事前準備
@RunWith(PowerMockRunner.class)
//1. 要使用 PowerMock來執行測試時需指定 Runner為 PowerMockRunner
@PrepareForTest(Utils.class)
//2. 靜態方法的目標class
public class VerificationPresenterTest {
@Test
public void sendVerification() throws Exception {
PowerMockito.mockStatic(Utils.class)
//3. 靜態方法的目標class
...
}
}
要使用PowerMock來測試靜態方法時比較麻煩,需設定
1. @RunWith
- @PrepareForTest
- mockStatic()
2. 建立需驗證互動的 class
@Mock
private ServerModel serverModel;
@Mock
private VerificationView verificationView;
由於這裡已經使用了 PowerMockito,就不用執行 MockitoAnnotations.initMocks(this)
3. 完成測試
- email格式錯誤
@Test
public void invalidEmail_should_showWarning() throws Exception {
PowerMockito.mockStatic(Utils.class);
//arrange
String email = "[email protected]";
Mockito.when(Utils.isEmail(email)).thenReturn(false);
//這裡的用法跟Mockito一樣
//act
VerificationPresenter verificationPresenter = new VerificationPresenter(serverModel, verificationView);
verificationPresenter.sendVerification(email);
//assert
Mockito.verify(verificationView).showWarning();
}
- email格式正確
@Test
public void validEmail_should_sendVerification() throws Exception {
PowerMockito.mockStatic(Utils.class);
//arrange
String email = "[email protected]";
Mockito.when(Utils.isEmail(email)).thenReturn(true);
//act
VerificationPresenter verificationPresenter = new VerificationPresenter(serverModel, verificationView);
verificationPresenter.sendVerification(email);
//assert
Mockito.verify(serverModel).sendVerification(email, verificationView);
}
完成!!執行測試看看吧!