使用Powermock模拟final类或方法

  对于使用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的类或方法是非常简单的。

你可能感兴趣的:(使用Powermock模拟final类或方法)