猿问

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

我正在尝试测试我的一个名为 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;


@Before

public 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”,我得到未完成的模拟异常


慕斯709654
浏览 396回答 3
3回答

拉丁的传说

Mockito 提供了一个方法doNothing()来模拟对 void 方法的调用。对于上面的问题 void 方法deleteFromRealm可以模拟为Mockito.doNothing().when(mockedObject).deleteFromRealm();因为deleteFromRealm是最终的,不能被嘲笑。模拟同一类的方法deleteObjectClassToBeTested testClass = new ClassToBeTested();ClassToBeTested testClassSpy = PowerMockito.spy(testClass);PowerMockito.doNothing().when(testClassSpy, "deleteObject", mockedRealm);

九州编程

我认为第三个参数when应该是一个模拟匹配器:PowerMockito.doNothing().when(store,&nbsp;"deleteObject",&nbsp;eq(mockedObject));

犯罪嫌疑人X

也许为时已晚,但您的问题的可能解决方案可能如下所示:PowerMockito.doNothing().when(store,&nbsp;"deleteObject",&nbsp;Matchers.any(RealmObject.class));亲切的问候
随时随地看视频慕课网APP

相关分类

Java
我要回答