我们编写代码的时候,总会写一些工具类,为了方便调用喜欢使用static关键字来修饰对应方法。
那么现在举例说明,还是准备两个接口,第一个是查询学生总数,第二个是新增学生两个接口,具体示例代码如下:
package com.rongrong.powermock.mockstatic;
import com.rongrong.powermock.service.Student;
/**
* @author rongrong
* @version 1.0
* @date 2019/11/23 8:08
*/
public class StudentStaticService {
/**
* 获取学生总数
* @return
*/
public int getStudentTotal(){
return StudentUtils.getStudent();
}
/**
* 创建一个学生
* @param student
*/
public void createStudent(Student student){
StudentUtils.createStudent(student);
}
}
接着我们再来看看这个静态工具类StudentUtils,具体代码示例如下:
package com.rongrong.powermock.mockstatic;
import com.rongrong.powermock.service.Student;
/**
* @author rongrong
* @version 1.0
* @date 2019/11/23 7:38
*/
public class StudentUtils {
/**
* 获取学生总数
* @return
*/
public static int getStudent(){
throw new UnsupportedOperationException();
}
/**
* 创建一个学生
* @param student
*/
public static void createStudent(Student student){
throw new UnsupportedOperationException();
}
}
接下来我们用传统方式,来做单元测试,示例代码如下:
@Test
public void testGetStudnetTotal(){
StudentStaticService staticService = new StudentStaticService();
int studentTotal = staticService.getStudentTotal();
assertEquals(studentTotal,10);
}
@Test
public void testCreateStudent(){
StudentStaticService staticService = new StudentStaticService();
staticService.createStudent(new Student());
assertTrue(true);
}
接着运行下测试用例,结果肯定报错了,为什么报错,这里就不再细说了,参考之前文章,报错,如下图所示:
接下来我们使用powermock来进行测试,具体示例代码如下:
@Test
public void testGetStudentWithMock(){
//先mock工具类对象
PowerMockito.mockStatic(StudentUtils.class);
//模拟静态类调用
PowerMockito.when(StudentUtils.getStudent()).thenReturn(10);
//构建service
StudentStaticService service = new StudentStaticService();
int studentTotal = service.getStudentTotal();
assertEquals(10,studentTotal);
}
@Test
public void testCreateStudentWithMock(){
//先模拟静态工具类
PowerMockito.mockStatic(StudentUtils.class);
//模拟调用
PowerMockito.doNothing().when(StudentUtils.class);
//构建service
StudentStaticService service = new StudentStaticService();
Student student = new Student();
service.createStudent(student);
//这里用powermock来验证,而不是mock,更体现了powermock的强大
PowerMockito.verifyStatic();
}
再次运行,测试通过,如下图所示:
运行之前先让powermock为我们准备了StudentUtils工具类,而且采用mockstatic的方法,最后我们用powermock.verifyStatic()验证,而不是mock,更体现了powermock的强大。