为了账号安全,请及时绑定邮箱和手机立即绑定

doNothing.When 对于私有 void 方法本身正在调用方法

doNothing.When 对于私有 void 方法本身正在调用方法

慕斯709654 2022-10-26 17:26:58
我正在尝试测试我的一个名为 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);


查看完整回答
反对 回复 2022-10-26
?
九州编程

TA贡献1785条经验 获得超4个赞

我认为第三个参数when应该是一个模拟匹配器:

PowerMockito.doNothing().when(store, "deleteObject", eq(mockedObject));



查看完整回答
反对 回复 2022-10-26
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

也许为时已晚,但您的问题的可能解决方案可能如下所示:

PowerMockito.doNothing().when(store, "deleteObject", Matchers.any(RealmObject.class));

亲切的问候


查看完整回答
反对 回复 2022-10-26
  • 3 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号