《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(3) https://developer.aliyun.com/article/1232478?groupCode=java
四、 when语句
1. when().thenReturn()模式
声明:
PowerMockito.when(mockObject.someMethod(someArgs)).thenReturn(expectedValue);
PowerMockito.when(mockObject.someMethod(someArgs)).thenThrow(expectedThrowable);
PowerMockito.when(mockObject.someMethod(someArgs)).thenAnswer(expectedAnswer);
PowerMockito.when(mockObject.someMethod(someArgs)).thenCallRealMethod();
用途:用于模拟对象方法,先执行原始方法,再返回期望的值、异常、应答,或调用真实的方法。
1) 返回期望值
2) 返回期望异常
3) 返回期望应答
4) 调用真实方法
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);
用途:用用于模拟对象方法,直接返回期望的值、异常、应答,或调用真实的方法,无需执行原始方法。
注意:千万不要使用以下语法,虽然不会出现编译错误,但是在执行时会抛出UnfinishedStubbingException异常。
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));
1) 返回期望值
2) 返回期望异常
3) 返回期望应答
4) 模拟无返回值
5) 调用真实方法
3. 两种模式的主要区别
两种模式都用于模拟对象方法,在mock实例下使用时,基本上是没有差别的。但是,在spy实例下使用时,when().thenReturn()模式会执行原方法,而doReturn().when()模式不会执行原方法。
测试服务类:
使用when().thenReturn()模式:
在测试过程中,将会打印出“调用获取用户数量方法”日志。
使用doReturn().when()模式:
在测试过程中,不会打印出“调用获取用户数量方法”日志。
4. whenNew模拟构造方法
声明:
PowerMockito.whenNew(MockClass.class).withNoArguments().thenReturn(expectedObject);
PowerMockito.whenNew(MockClass.class).withArguments(someArgs).thenReturn(expectedObject);
用途:用于模拟构造方法。
案例:
注意:需要加上注解@PrepareForTest({FileUtils.class}),否则模拟方法不生效。
《Java单元测试实战》——基础知识:Java单元测试技巧之PowerMock(5) https://developer.aliyun.com/article/1232475?groupCode=java