使用Powermock模拟final类或方法
2018-06-20 本文已影响0人
SeanPenn
对于使用final修饰符修饰的类或方法,都是不能被继承的,Mockito也不支持mock带final修饰符的类和方法,如果想要mock final,仍然需要使用Powermock。
一、final类
首先看下被测试代码:
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
final public class UserManage {
public boolean insertUser(User user) {
throw new UnsupportedOperationException();
}
}
public class UserService {
private UserManage userManage;
public UserService(UserManage userManage) {
this.userManage = userManage;
}
public void createUser(User user) {
userManage.insertUser(user);
}
}
UserManage是一个使用final修饰的类,在UserService类中被使用。现在如果想要测试createUser方法,而UserManage的insertUser方法还没有被实现,因此需要对这个方法进行mock。
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserManage.class})
public class UserServiceTest {
@Mock
private UserManage userManage;
@Test
public void testCreateUser() throws Exception {
User user = new User("test1", "123");
PowerMockito.when(userManage.insertUser(user)).thenReturn(true);
UserService userService = new UserService(userManage);
userService.createUser(user);
Mockito.verify(userManage).insertUser(user);
}
}
此处需要注意的是需要把UserManage.class放入到@PrepareForTest的括号里面。
二、final方法
mock final方法和mock final类的方式是一样的,现在修改下UserManage类,其他代码不变,执行测试代码时仍然是正确的。
public class UserManage {
public final boolean insertUser(User user) {
throw new UnsupportedOperationException();
}
}
从上面的例子可以看出,mock final的类或方法是非常简单的。