android - Mockito - 缺少方法调用异常

标签 android mockito retrofit2 rx-android

我正在尝试测试 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 - 缺少方法调用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868979/

相关文章:

java - RxJava2 轮换后调用 onNext Consumer 两次

android - Retrofit 2 有两条动态路径

java - 使用 GSON 从 JSON 转换,无法将 ArrayList 转换为对象

java - 为什么我的 AndroidHttpClient 在我调用 Execute 时不发送参数?

java - 如何在 Java 中模拟静态方法?

android - 使用 Retrofit 2 + RxJava 2 接收 Gzip JSON 响应

android - 监听事件以触发另一个类中的方法 (Rx)

java - Activity 错误甚至认为它在 list 中声明

java - 多个级别的@Mock 和@InjectMocks

java - 如果该参数的状态已更改,如何验证传递的参数是否具有正确的参数?