我正在尝试测试我的一个名为 Store 的类,特别是下面名为 removeFromFavourite 的方法是该方法 public void removeFromFavourite(Quote quote) { if(quote == null) { throw new IllegalArgumentException("Quote can't be null"); } if (quote.getId() <1) { throw new IllegalArgumentException("Quote id can't be less than 1"); } realm.beginTransaction(); QuoteRealMObject object = realm.where(QuoteRealMObject.class). equalTo(QuoteRealMObject.ID, quote.getId()).findFirst(); if(object != null) { deleteObject(object); } realm.commitTransaction(); } private void deleteObject(RealmObject object) { object.deleteFromRealm(); }我创建了 deleteObject 方法来调用 deleteFromRealm,因为 deleteFromRealm 是最终的,因此我无法模拟它。我的期望是通过创建间谍来模拟对“deleteObject”ob Store 对象的调用这是我的@Before方法private Realm mockedRealm;private Store store;@Beforepublic void setUp() throws Exception { mockedRealm = Mockito.mock(Realm.class); store = new Store(mockedRealm); store = PowerMockito.spy(store);}所以我创建了一个 Realm 的模拟对象并使用它来创建类 Store 的对象,然后从 store 的对象中创建一个间谍并将其分配回 store 对象本身。以下是 removeFromFavourite 的测试方法@Test public void removeFromFavourite() throws Exception { Quote quot = new Quote(); quot.setId(1); RealmQuery<QuoteRealMObject> query = Mockito.mock(RealmQuery.class); RealmQuery<QuoteRealMObject> filteredQuery = Mockito.mock(RealmQuery.class); Mockito.when(mockedRealm.where(QuoteRealMObject.class)).thenReturn(query); Mockito.when(query.equalTo(QuoteRealMObject.ID, 1)).thenReturn(filteredQuery); QuoteRealMObject mockedObject = Mockito.mock(QuoteRealMObject.class); Mockito.when(filteredQuery.findFirst()).thenReturn(mockedObject); PowerMockito.doNothing().when(store, "deleteObject", mockedObject); store.removeFromFavourite(quot); }这里的行PowerMockito.doNothing().when(store, "deleteObject", mockedObject);本身正在调用真正的私有方法“deleteObject”,我得到未完成的模拟异常
3 回答

拉丁的传说
TA贡献1789条经验 获得超8个赞
Mockito 提供了一个方法doNothing()来模拟对 void 方法的调用。对于上面的问题 void 方法deleteFromRealm可以模拟为
Mockito.doNothing().when(mockedObject).deleteFromRealm();
因为deleteFromRealm是最终的,不能被嘲笑。模拟同一类的方法deleteObject
ClassToBeTested testClass = new ClassToBeTested();
ClassToBeTested testClassSpy = PowerMockito.spy(testClass);
PowerMockito.doNothing().when(testClassSpy, "deleteObject", mockedRealm);

九州编程
TA贡献1785条经验 获得超4个赞
我认为第三个参数when
应该是一个模拟匹配器:
PowerMockito.doNothing().when(store, "deleteObject", eq(mockedObject));

犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
也许为时已晚,但您的问题的可能解决方案可能如下所示:
PowerMockito.doNothing().when(store, "deleteObject", Matchers.any(RealmObject.class));
亲切的问候
添加回答
举报
0/150
提交
取消