前言
我们在编码的时候,总习惯在构造器中传参数,那么在powermock中是怎么模拟带参数构造的呢,这并不难。
模拟场景
我们先模拟这样一个场景,通过dao中的传入一个是布尔类型(是否加载)和一个枚举类(使用哪种数据库),构造Dao这个类,在编写一个插入学生方法
dao部分的代码
具体示例代码如下:
package com.rongrong.powermock.mockconstructor; /** * @author rongrong * @version 1.0 * @date 2019/11/28 23:12 */ public class StudentConstructorDao { public enum DataBaseType{ MYSQL, ORACLE, } /** * * @param isLoad 数据库是否加载即链接 * @param dataBaseType 数据库类型 */ public StudentConstructorDao(Boolean isLoad,DataBaseType dataBaseType) { throw new UnsupportedOperationException(); } public void insertStudent(StudentConstructor studentConstructor){ throw new UnsupportedOperationException(); } }
service部分代码
用来调用dao中的函数,具体代码如下:
package com.rongrong.powermock.mockconstructor; /** * @author rongrong * @version 1.0 * @date 2019/11/28 23:18 */ public class StudentConstructorService { public void createStudnet(StudentConstructor studentConstructor){ StudentConstructorDao studentConstructorDao = new StudentConstructorDao(false, StudentConstructorDao.DataBaseType.MYSQL); studentConstructorDao.insertStudent(studentConstructor); } }
编写测试用例
使用powermock去模拟构造函数,并测试这个service,具体代码如下:
package com.rongrong.powermock.mockconstructor; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static com.rongrong.powermock.mockconstructor.StudentConstructorDao.DataBaseType.MYSQL; /** * @author rongrong * @version 1.0 * @date 2019/11/28 23:54 */ @RunWith(PowerMockRunner.class) @PrepareForTest(StudentConstructorService.class) public class TestStudentConstructorService { @Test public void testStudentConstructorService(){ StudentConstructorDao studentConstructorDao = PowerMockito.mock(StudentConstructorDao.class); try { //此处需要注释下,需要构造一个带参数的Dao对象,即便是假的也要带参数,该类初始化的时候就带参数 PowerMockito.whenNew(StudentConstructorDao.class).withArguments(false,MYSQL).thenReturn(studentConstructorDao); StudentConstructor studentConstructor = new StudentConstructor(); StudentConstructorService studentConstructorService = new StudentConstructorService(); studentConstructorService.createStudnet(studentConstructor); Mockito.verify(studentConstructorDao).insertStudent(studentConstructor); } catch (Exception e) { e.printStackTrace(); } } }
总结
- 首先mock了一个StudentConstructorDao对象实例
- 使用whenNew语法,传入必须入参,注意这里的参数必须和Service中的参数一致,否则会在Service中还会继续创建一个新的StudentConstructorDao实例
- 接着验证方法的调用
注意:当不能确定构造器中参数时,使用withAnyArguments()即可,关于Student类代码,参照之前文章Student类,此处略