我正在嘗試測試我的一個名為 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
提交
取消