⑴ 如何嘲笑私有方法使用PowerMock測試
1、用下面的的Mockito的API,我成功地做到這一點:public class CodeWithPrivateMethod {
public void meaningfulPublicApi() {
if (doTheGamble("Whatever", 1 << 3)) {
throw new RuntimeException("boom");
}
}
private boolean doTheGamble(String whatever, int binary) {
Random random = new Random(System.nanoTime());
boolean gamble = random.nextBoolean();
return gamble;
}
}
而這里的JUnit測試:import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.moles.junit4.PowerMockRunner;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
@RunWith(PowerMockRunner.class)
@PrepareForTest(CodeWithPrivateMethod.class)
public class CodeWithPrivateMethodTest {
@Test(expected = RuntimeException.class)
public void when_gambling_is_true_then_always_explode() throws Exception {
CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());
when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class))
.withArguments(anyString(), anyInt())
.thenReturn(true);
spy.meaningfulPublicApi();
}
}
2. 這將與任何測試的一個通用的解決方案是創建你自己的嘩握模擬。 更改您要保護的。 在你的測試類擴展類 覆蓋到返回的任何常量想要 這沒有按'任意所以它不是優雅,但它會一直工作,即使沒有PowerMock。另外,您的Mockito來為你做的步驟#2&#3,如果你已經做了第一步了。要直接嘲笑一個,你將需要PowerMock如圖對方森頌的回答。
3. 實際它是此蘆鄭扔是不是從它的我覺得還是你的測試並不如預期。
⑵ 如何給一個私有方法做單元測試
1. 是不是需要對一個方法(無論是public或是private)取決於這個函數的復雜度和價值,並不是所有的function都要測試的,除非需要追求很高的測試覆蓋率。這樣的話是否需要對一個private方法進行測試就看這個private方法是不是比較重要、復雜、容易出錯,其實這個原則也適用於Public的方法,你總不會去測試Java的setter和getter吧。
2. 很多時候private的方法的測試時可以通過對public方法的測試間接來達到的。一個設計良好的、充分運用TDD的工程完全可以通過對public方法提供完整派孫慧的用例就可以覆蓋private方法。
3. 僅僅為了能夠進行單元測試,而採用將private方法改成public方法通常是不合適的,這樣會暴露出不該暴露的實現細節,另外介面過多也破壞了SRP(單一職責原則)。
4. 當你非常渴望測試一個private方法的時候,可以仔細評估這個private方法和目前所在類的關系,這樣的private方法是不是應該遷移到另塵答一個類中,在另一個類中作為public提供介面給調用方(我通常這么干)。
5. 最後一個測試private的途徑就是利用語言提供的反射功能,在testcase中將private方法修改成public的,以凱敏此來實現對private方法的測試。
⑶ 使用Powermock對私有方法進行mock
團譽宏 在public方法中往往會調用一些private方法,如果private方法很復雜,我們就需要處理很多方法的mock。如果這時只想要測試public方法,並不想關注private方法的邏輯,那麼就需要虛歷對private方法進行mock。下面我們簡單介紹下如何通過Powermock來對私有方法進行mock。
被測試類:
此類中包含一個public方法mockPrivateFunc,裡面調用了private方法privateFunc。當前我們想要測試該public方法,並且不想進入private方法執行,那麼就需要對該塌冊私有方法進行模擬。
測試類:
1、由於是對本類的私有方法進行模擬,所以需要在PrepareForTest後面加上MockPrivateClass,同時需要使用spy來模擬一個對象。
2、 使用下面方式來模擬私有方法:
如果私有方法存在參數,則同樣的需要在私有方法名後面帶上同樣個數及類型的參數,其方法原型為:
3、使用verifyPrivate來驗證私有方法被調用,其例如下:
verifyPrivate的參數為mock的對象,及驗證模式(可選),invoke參數為要驗證的私有方法名稱及相應參數。
⑷ IOS 單元測試怎麼測試私有方法
直接呼叫就好了你還是可以呼叫,只是編譯器會給你警告
⑸ junit有什麼方法可以測試私有方法
有一個invoke方法可以
⑹ JUnit test 如何做Java靜態方法測試
使用junit測試Java靜態私有方法,通過以下案例進行分析:
測試目標類如下:
packagecn.outofmemory.junit;
publicclassTestTarget{
/**
*移除正則表達式中需要轉義的字元
*@paramwword
*@return移除正則表達式中需要轉義的字元
*@authorAdministrator
*@date2015-7-11
*/
(Stringw){
if(w==null){
returnnull;
}
String[]convertedChars={"\",".","+","*","(",")","{","}","[","]","?","/","^","$","|"};
for(Stringc:convertedChars){
w=w.replace(c,"\"+c);
}
returnw;
}
}
測試方法:
@Test
publicvoidtestConvert4Regex()throwsException{
Stringinput="A+";
Stringexpected="A\+";
MethodtargetMethod=TestTarget.class.getDeclaredMethod("convert4Regex",String.class);
targetMethod.setAccessible(true);
Objectactual=targetMethod.invoke(TestTarget.class,newObject[]{input});
assertEquals(expected,actual);
}
⑺ java 私有的屬性,方法和公有的介紹一下
publicclassTest{
privateStringgen; //私有屬性,表示用戶性別
publicStringgetGen(){ //公開方法,用來獲取這個用戶的性別
returngen;
}
publicvoidsetGen(Stringgen){ //公開方法,用來獲取這個用戶的性別
this.gen=testGen(gen); //當用戶設置性斗或別的燃森時候,調用私有方法來判斷參數是否合法
}
/**
*私有方法,用來測試用戶設置的性別是否為男|女,如果設置不正確默認為男
*@paramgen 可選值,男|女
*@return如果不合法,則返回男
*/
privateStringtestGen(Stringgen){
if("男".equals(gen)||"女".equals(gen)){
returngen;
}else{
return空段伍"男";
}
}
publicstaticvoidmain(String[]args){
}
}
⑻ 一個公有方法裡麵包含私有方法時,該怎樣進行單元測試
如果這個方碼凱胡法復雜到你必須對它進行單元測試,那麼你可遲攔以把它重構到一個獨立的class中,然後針孫棚對這個class來建立單元測試。