【问题标题】:Using mockito to stub a void method使用 mockito 存根 void 方法
【发布时间】:2017-03-01 09:15:23
【问题描述】:
mockito-core:2.7.10

我正在使用 mockito 测试以下方法

@Override
public void detachView() {
    mMovieListViewContract = null;
    mMovieModelContract.releaseResources();
}

我正在对具有 void 返回的 releaseResources 方法进行存根。并进行测试以确保存根版本只被调用一次。

@Override
public void releaseResources() {
    if(mSubscription != null && !mSubscription.isUnsubscribed()) {
        mSubscription.unsubscribe();
    }
}

我写了以下测试:

@Test
public void shouldReleaseModelResourcesWhenDetached() {
   doNothing().when(mockMovieListModelContract).releaseResources();

   movieListPresenterContract.detachView();

   verify(mockMovieListModelContract, times(1)).releaseResources();
}

我想验证mockMovieListModelContract.releaseResources() 的存根版本是否只被调用一次。 以下测试失败:

verify(mockMovieListModelContract, times(1)).releaseResources();

测试失败:

Wanted but not invoked:
movieListModelContract.releaseResources();
Actually, there were zero interactions with this mock.

所以我改为使用通过测试的verifyZeroInteractions(mockMovieListModelContract);。但是,验证存根版本是否只被调用一次的测试。

【问题讨论】:

  • 你能展示完整的测试方法吗? Mock and Before 和 Spy 注释用法是我最感兴趣的
  • 这里显示的代码看起来不错。会不会是初始化问题?即mockMovieListModelContract 没有注入到movieListPresenterContract 实例中。
  • 谢谢大家,你是对的,我没有在 MovieListPresenterImp 的构造函数中注入 MovieListModelContract。我正在使用 Dagger2 依赖注入并忘记添加它。
  • 仅作记录:以防我的回答在这里有所帮助;考虑在某个时候接受。或者让我知道缺少什么让它值得接受;-)

标签: android mockito


【解决方案1】:

直截了当:模拟框架告诉您该方法并未在该模拟对象上调用。

对此只有两种解释:

  • 没有真正运行您在问题中显示的生产代码(您正在测试其他内容)
  • 您的设置有问题;并且您在进行测试设置时没有“插入”模拟对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多