介于日本的形式主义junit4单体测试,特记笔记,以下纯用手机打出来,因为电脑禁止复制粘贴。
pom文件
powermock-module-junit1.7.4
powermock-api-mokcito 1.7.4
spring-test 8
1,测试类头部打注解
@RunWith(PowerMockRunner.class)
@PrepareForTest({xxx.class,xxxx.class})
2,分情况讨论
举例:
public class IBExecIF
{
public ResultInformation Reflect(String finCode,String fileName){
A a=this.getA();
B b=new B(a.getSendFolder(),a.getFinName()));
b.load();
String bData=b.getData();
try{
this.http.send(session,str,str,MethodInfo);
}catch(MyException e){}
catch(Exception ex){}
String str=IBExecUtils.getProperty("xxx");
}
private void getA(){}
}
(1)测试某public方法,mock被测试类的私有方法
比如getA
首先测试类样子如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest({IBExecIF.class})
public class IBExecIFTest{
@InjectMocks
private IBexecIF ibExecIF;
//mock用
private IBexecIF mockIBExecIF;
@BeforeClass@AterClass略
@Before
public void setUp() throws Exception{
MockitoAnnoations.initMocks();//必须有
}
@Test
public void testIBExecIF_001 extends Exception{
A mockA=new A(xxx,xxx,xxx);
mockIBExecIF=PowerMockito.spy(ibExecIF);
PowerMockito.doReturn(mockA).when(mockIBExecIF,"getA");
//调用被测试类公有方法
ResultInformation result=mockIBExecIF.Reflect(xx,xx);
assertEquals();
}
(2)测试某public方法,mock被测试类的私有方法,有参数,无返回值
修正为(后面继续接参数即可)
PowerMockito.doNothing().when(mockIBExecIF,"getA",anyString(),any());
(3)测试某public方法,mock方法中调用其他类的构造函数及其方法(以公有为例)
测试类头部加入@PrepareForTest({IBExecIF.class,B.class})
B mockB=PowerMockito.mock(B.class);
PowerMockito.whenNew(B.class).withAnyArguments().thenReturn(mockB);
PowerMockito.when(mockIBExecIF.getData()).thenReturn("testData");
若为无参构造,且是无返回值的方法
PowerMockito.whenNew(B.class).withNoArguments().thenReturn(mockB);
PowerMockito.doNothing().when(mockIBExecIF,"load");
(4)测试某public方法,该方法中调用了成员变量(可以是类),的某个方法(与3不同,变量声明在方法外)
以类为例,测试类头部加入@PrepareForTest({IBExecIF.class,HttpConnecter.class})
HttpConnecter mockH=PowerMockito.mock(HttpConnecter.class);
//把mock的值赋值回类
Whitebox.setInternalState(mockIBExcecIF,"http",mockH);
PowerMockito.when(mockH.send(any(),anyString(),anyString(),any())).thenReturn("testData");
(5)测试某public方法,该方法中调用了其他类的static方法(比如工具类),mock该static方法
测试类头部加入@PrepareForTest({IBExecIF.class,IBExecUtils.class})
PowerMockito.mockStatic(IBExecUtils.class);
Mockito.when(IBExecUtils.getProperty(anyString())).thenReturn("test");
3,对变量进行mock
public class IBExecIF{
private String finCode;
}
(1)在测试类中设置公有类中的private成员变量
注意:此时不可通过mock的形式得到被测试类的实例,只能正常new
mockIBExecIF=new IBExecIF();
Field field=IBExecIF.class.getDeclaredField("finCode");
field.setAccessible(true);
filed.set(mockIBExecIF,"test");