接上篇:https://developer.aliyun.com/article/1228065?spm=a2c6h.13148508.setting.17.4a864f0e4FO91p
2. doReturn().when()模式
声明
• PowerMockito.doReturn(expectedValue).when(mockObject).someMethod(someArgs);
• PowerMockito.doThrow(expectedThrowable).when(mockObject).someMethod(someArgs);
• PowerMockito.doAnswer(expectedAnswer).when(mockObject).someMethod(someArgs);
• PowerMockito.doNothing().when(mockObject).someMethod(someArgs);
• PowerMockito.doCallRealMethod().when(mockObject).someMethod(someArgs);
用途
• 用于模拟对象方法,直接返回期望的值、异常、应答,或调用真实的方法,无需执行原始方法。
注意:
千万不要使用以下语法:
• PowerMockito.doReturn(expectedValue).when(mockObject.someMethod(someArgs));
• PowerMockito.doThrow(expectedThrowable).when(mockObject.someMethod(someArgs));
• PowerMockito.doAnswer(expectedAnswer).when(mockObject.someMethod(someArgs));
• PowerMockito.doNothing().when(mockObject.someMethod(someArgs));
• PowerMockito.doCallRealMethod().when(mockObject.someMethod(someArgs));
虽然不会出现编译错误,但是在执行时会抛出UnfinishedStubbingException异常。
返回期望值:
返回期望异常:
返回期望应答:
模拟无返回值:
调用真实方法:
2. 两种模式的主要区别
两种模式都用于模拟对象方法,在mock实例下使用时,基本上是没有差别的。但是,在spy实例下使用时,when().thenReturn()模式会执行原方法,而doReturn().when()模式不会执行原方法。
1) 测试服务类
2) 使用when().thenReturn()模式
在测试过程中,将会打印出“调用获取用户数量方法”日志。
3) 使用doReturn().when()模式
在测试过程中,不会打印出“调用获取用户数量方法”日志。
4. whenNew模拟构造方法
声明
• PowerMockito.whenNew(MockClass.class).withNoArguments().thenReturn(expectedObject);
• PowerMockito.whenNew(MockClass.class).withArguments(someArgs).thenReturn(expectedObject);
用途
• 用于模拟构造方法。
案例
注意:
需要加上注解“@PrepareForTest({FileUtils.class})”,否则模拟方法不生效。
接下篇:https://developer.aliyun.com/article/1228063?groupCode=java