PowerMock探路记

编程入门 行业动态 更新时间:2024-10-11 03:15:30

<a href=https://www.elefans.com/category/jswz/34/1721992.html style=PowerMock探路记"/>

PowerMock探路记

单独测试私有方法

//单独测试私有方法isPrivate
public class A{//用于mock私有成员变量private double distance;private void isPrivate(String str){if(StringUtils.isEmpty(str)){throw new Exception("test");}}
}
//test类
@RunWith(PowerMockRunner.class)
//@PrepareForTest({ A.class }) //使用到静态方法时才需要这个注解
// spring boot 使用时防止javax.management相关异常
@PowerMockIgnore("javax.management.*")
public class ATest{@Mockprivate A a;//测试异常@Ruleprivate ExpectedException        thrown = ExpectedException.none();@Testpublic void testIsPrivate(){Method method = PowerMockito.method(A.class, "isPrivate", String.class);//预期Exceptionthrown.expect(Exception.class);//预期异常messagethrown.expectMessage("test");method.invoke(a,null);  //mock私有成员变量Field field = PowerMockito.field(A.class,"distance");//为a对象赋值field.set(a,20d);}
}

mock类私有属性

public class A{private String str;public void doSomething(){//do some thing}
}
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
public class ATest{@InjectMocksprivate A a;@Testpublic void testDoSomething(){MemberModifier.field(A.class, "str").set(a, "value");}
}

mock同类中其他方法

class A{public void isPublic(String str){isPrivate(str);}private void isPrivate(String str){if(StringUtils.isEmpty(str)){throw new Exception("test");}}
}
//因为isPrivate已经测试过,这里不想重复测试
public ATest{//如果是测试类,支持@InjectMocks@Mockprivate A a;@Testpublic void testIsPublic(){//如果简单类不写private A a;//也可以替换为A spy = PowerMockito.spy(new A());//需要注意:调用isPublic和调用isPrivate必须是同一个mock对象,否则mock无效A spy = PowerMockito.spy(a);//如果有返回,不可以使用thenReturn,否则会先执行方法体PowerMockito.doNothing().when(spy, "isPrivate", isA(String.class));spy.isPublic(BDDMockito.any());}
}

参数捕获器

class A{private B b;public void find(Integer age){BFilter filter = new BFilter();if(age != null){filter.setAge(age);if(age >= 18){filter.setLevel(2);}}b.findByFilter(filter);}
}
class B{public List<B> findByFilter(BFilter filter){//do something}
}
class BFilter{private String name;private int age;private byte level;//get And set
}
//测试findByFilter入参是否符合预期
class ATest{@Mockprivate B b;@InjectMocksprivate A a;@Testpublic void testFind(){// BDDMockito.willReturn(null).give(b).findByFilter(BDDMockito.any());a.find(18);//申明参数捕捉器捕捉参数类型ArgumentCaptor<BFilter> captor = ArgumentCaptor.forClass(BFilter.class);//参数捕捉器作用于哪一个方法配置BDDMockito.verify(b).findByFilter(captor.capture());BFilter filter = captor.getValue();Assert.assertEqual(filter.getAge(),18);Assert.assertEqual(filter.getLevel(),2);}
}
/**
* mock私有方法 && 多参数捕获 
**/
class A{public void isPublic(){BFilter fitler = new BFilter();filter.setName("小二哥");isPrivate(filter,"others is nothing!");}private void isPrivate(BFilter filter,String otherArgument){//do something}
}class ATest{@Testpublic void testIsPublic(){A a = PowerMockito.spy(new A());//不执行isPrivate 方法PowerMockito.doNothing().when(a,"isPrivate",isA(BFilter.class),isA(String.class));a.isPublic();//这一行不能省 否则verify会真实调用isPrivate方法PowerMockito.doNothing().when(a,"isPrivate",isA(BFilter.class),isA(String.class));ArgumentCaptor<BFilter> captor = ArgumentCaptor.forClass(BFilter.class);PowerMockito.verifyPrivate(a).invoke(,"isPrivate",isA(BFilter.class),isA(String.class));Assert.assertEqual(captor.getValue().getName,"小二哥");}
}

匿名内部类测试

public class A{@Autowiredprivate TransactionTemplate         transactionTemplate;public boolean anonymousMethod(){return transactionTemplate.execute(new TransactionCallback<Boolean>() {@Overridepublic Boolean doInTransaction(TransactionStatus status) {//do some thingreturn false;}});}
}public class ATest{@InjectMocksprivate A a;@Mockprivate TransactionTemplate transactionTemplate;@Testpublic void testAnonymousMethod(){PowerMockito.when(transactionTemplate.execute(any())).thenAnswer(new Answer<Boolean>() {@Overridepublic Boolean answer(InvocationOnMock invocation) throws Throwable {TransactionCallback arg = (TransactionCallback) invocation.getArgument(0);arg.doInTransaction(new SimpleTransactionStatus());return true;}});a.anonymousMethod();}
}

可变参数mock & mock同一类型的两个对象

public class A{public void test(String... str){//do something}
}
public class B{//mock同一类型的两个对象@Autowired@Qualifier("a1")private A a1;@Autowired@Qualifier("a2")private A a2;public void test(){a1.test("a1");a2.test("a2");//do something}
}
public class BTest{@InjectMocksprivate B b;//mock同一类型的两个对象@Mock(name="a1")private A a1;@Mock(name="a2")private A a2;public testTest(){//强转any()willDoNothing().given(a1).test((String[])any());b.test();}}

any()和eq()配合使用

public class  A{public void testA(String str,Integer number){//do something}
}
public class B{private A a;public void testB(String str){//do somethinga.testA(str,str.lengh());//do something}
}
//测试
public class BTest{private A a;private B b;@Testpublic void testTestB(){//指定值和any()配合使用willDoNothing().given(a).testA(BDDMockito.eq("hello"),BDDMockito.any());b.testB();}
}

 

更多推荐

PowerMock探路记

本文发布于:2024-03-07 14:46:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718108.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:PowerMock

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!