⑴ 如何嘲笑私有方法使用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来建立单元测试。