mocking - mockito-mocked 服务不返回 true,总是返回 false
问题描述
下面的代码 (CallService.java) 调用一个名为 AService 的服务并进行一些更新,然后返回一个布尔值。
public boolean getUpdateStatus() throws ServiceException {
if (finder == null) {
finderBean = new FinderBean();
}
myService = finderBean.find(AService.class);
if (myService == null) {
System.out.println("null >>>>>>>");
}
final Config config = new Config();
final Update update = new Update();
status = myService.update(update, config);
System.out.println("Status: " + status);
return status;
}
下面的测试用例验证了 CallService.java;已经模拟了所有与服务相关的类并调用我的测试类来调用 AService 并断言 bolean,但无论模拟如何,模拟总是返回 false。
@Before
public void setUp() throws Exception {
myService = PowerMockito.mock(AService.class);
finderBean = PowerMockito.mock(FinderBean.class);
update = PowerMockito.mock(Update.class);
config = PowerMockito.mock(Config.class);
PowerMockito.whenNew(FinderBean.class).withNoArguments().thenReturn(finderBean);
PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
}
@Test
public void TestUpdateState() throws Exception {
callService = new CallService();
MemberModifier.field(CallService.class, "finderBean").set(callService, finderBean);
PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
PowerMockito.when(myService.update(update, config)).thenReturn(true);
final boolean status = callService.getUpdateStatus();
assertTrue(status);
}
我在这里遗漏了什么,有什么指示吗?
谢谢。
解决方案
根据文档
所有用法都需要在类级别
@RunWith(PowerMockRunner.class)
进行注释。@PrepareForTest
使用 PowerMockito.whenNew,例如
whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message"));
请注意,您必须准备创建
MyClass
用于测试的新实例的类,而不是其MyClass
本身。例如,如果new MyClass()
调用了类 doingX
那么您必须这样做@PrepareForTest(X.class)
才能whenNew
工作:
强调我的
因此,请确保您拥有必要的属性,并且相应地模拟了依赖项
@RunWith(PowerMockRunner.class)
@PrepareForTest(CallService.class)
public class TestMyClass {
FinderBean finderBean;
AService myService;
@Before
public void setUp() throws Exception {
myService = PowerMockito.mock(AService.class);
finderBean = PowerMockito.mock(FinderBean.class);
PowerMockito.whenNew(FinderBean.class).withNoArguments().thenReturn(finderBean);
}
@Test
public void TestUpdateState() throws Exception {
//Arrange
PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
PowerMockito.when(myService.update(any(Update.class), any(Config.class))).thenReturn(true);
CallService callService = new CallService();
//Act
final boolean status = callService.getUpdateStatus();
//Assert
assertTrue(status);
}
}
它以前无法与您的模拟服务一起工作的原因是因为测试中的参数与被测方法中的参数不同。被测方法在本地创建自己的实例,这意味着它们将与测试设置中使用的实例不同,因此在调用时不会按预期运行。
推荐阅读
- android - Android 外部存储处理
- micronaut - 如何在 Micronaut 应用程序的 application.yml 中设置活动配置文件?
- php - Symfony3 验证错误:此值无效
- rendering - 为什么三角形的所有线都保证在同一个平面上
- flutter - Flutter http.post 抛出 405 需要 POST 方法
- strapi - 如何在strapi headless cms的另一个嵌套组件中创建嵌套组件?
- nokia-s40 - 在OLT中配置vlan id时使用new-secure-fwd enable和new-broadcast enable但不知道确切含义。需要帮助理解
- c++ - 调用模板化成员函数,该函数将对象及其 C++ 中的成员函数之一作为参数
- package.json - package.json 中脚本名称中的双波浪号 (~~) 是什么意思?
- html - 如何在 Powershell HTML 电子邮件中显示变量