PowerMockito框架mock范型返回问题

PowerMock是最近主要使用的自动化测试框架,主要有强大的mock能力,无论是静态方法还是接口调用。但是今天遇到一个问题,关于范型返回 mock的问题,最后问题得到了解决,我看中文引擎基本没这个问题的解决方案,所以特此记录以下。

  • 首先看我需要 mock 的对象和方法
/**
 * User基类
 * 两个具体类Manager 与 Programer
 */
abstract class User {

}
class Manager extends User {

}
class Programer extends User {

}

/**
 * 需要mock的方法
 */
interface UserService {

    /**
     * 上界限定范化集合
     * @return
     */
    List<? extends User> getUserList();

    /**
     * 上界限定范化集合
     * @param <T>
     * @return
     */
    <T extends User> List<T> getSpecifyUserList();
}

两个方法的区别我想大家应该都会知道有啥区别,不过我还是想解释下:

class UserServiceImpl implements UserService {
    @Override
    public List<? extends User> getUserList() {
    	// 这里返回的集合可以是一种或多种User子类
        List<User> userList = Lists.newArrayList();
        userList.add(new Manager());
        userList.add(new Programer());
        return userList;
    }

    @Override
    public <T extends User> List<T> getSpecifyUserList() {
    	// 这里返回的集合必须是一种User子类
        List<Programer> userList = Lists.newArrayList();
        userList.add(new Programer());
        return (List<T>) userList;
    }
}
  • PowerMock进行mock方法
	@Test
    public void mock() {
        System.out.println("hello MockPowerito!");
    }


    @Test
    public void mockTestGeneric() {

        UserService userService = PowerMockito.mock(UserService.class);
        // 这里报编译错误,提示不能解析该方法
        PowerMockito.when(userService.getUserList()).thenReturn(mockProgramerList());

    }

    private List<? extends User> mockProgramerList() {
        return Lists.newArrayList(new Programer());
    }

不能mock因为有类型安全校验。其实mock有绕过类型校验的方法doReturn

		UserService userService = PowerMockito.mock(UserService.class);
//        PowerMockito.when(userService.getUserList()).thenReturn(mockProgramerList());
        
        // 正确姿势
        PowerMockito.doReturn(mockProgramerList()).when(userService).getUserList();

(注意前面的when是方法级别,正确姿势是when类级别)这样即可达到预期mock。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值