gpt4 book ai didi

android - Mockito - MissingMethodInvocationException

转载 作者:搜寻专家 更新时间:2023-11-01 09:48:20 25 4
gpt4 key购买 nike

我正在尝试测试 API 调用是否安排在正确的调度程序上并在主线程上进行观察。

@RunWith(PowerMockRunner.class)
@PrepareForTest({Observable.class, AndroidSchedulers.class})
public class ProductsPresenterTest {

private ProductsPresenter presenter;
@Before
public void setUp() throws Exception{
presenter = spy(new ProductsPresenter(mock(SoajsRxRestService.class)));
}


@Test
public void testShouldScheduleApiCall(){
Observable productsObservable = mock(Observable.class);
CatalogSearchInput catalogSearchInput = mock(CatalogSearchInput.class);
when(presenter.soajs.getProducts(catalogSearchInput)).thenReturn(productsObservable);

/* error here*/
when(productsObservable.subscribeOn(Schedulers.io())).thenReturn(productsObservable);
when(productsObservable.observeOn(AndroidSchedulers.mainThread())).thenReturn(productsObservable);
presenter.loadProducts(catalogSearchInput);

//verify if all methods in the chain are called with correct arguments
verify(presenter.soajs).getProducts(catalogSearchInput);
verify(productsObservable).subscribeOn(Schedulers.io());
verify(productsObservable).observeOn(AndroidSchedulers.mainThread());
verify(productsObservable).subscribe(Matchers.<Subscriber<Result<Catalog<SoajsProductPreview>>>>any());
}
}

线

when(productsObservable.subscribeOn(Schedulers.io())).thenReturn(productsObservable);

抛出以下异常,我不明白为什么,因为 productObservable 是模拟的。有任何想法或类似经验吗?

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.

最佳答案

问题是由于 Observable::subscribeOn 是 final方法,Mockito can't mock .一种可能的解决方案是使用 Powermock:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Observable.class)
public class MockTest {
@Test
public void test() {
Observable productsObservable = PowerMockito.mock(Observable.class);

when(productsObservable.subscribeOn(null)).thenReturn(productsObservable);
productsObservable.subscribeOn(null);
verify(productsObservable).subscribeOn(null);
}
}

关于android - Mockito - MissingMethodInvocationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com