【问题标题】:Mockito can't verify subMethod callMockito 无法验证子方法调用
【发布时间】:2017-07-07 23:00:57
【问题描述】:

我在测试方面有点新手,所以请耐心等待。

我想测试我的 onDismiss() 方法的行为。我想确保 onDismiss() 确实调用了 showDialog() 方法。为了做到这一点,我想验证是否调用了 showDialog() 中的模拟。 我收到一条错误消息,说与该模拟没有交互。如果我在调试模式下运行它,我看到我们踩到了 loadingDialog.show() 行,我仍然收到此错误。

问题:

  • 我想知道,在这种情况下如何测试 subMethod 调用?
  • 为什么会这样?

(showDialog() 已经被单独的测试覆盖)

测试

      sut.onDismiss(mockDialog)
      verify(mockLoadingDialog, times(1)).show();

代码

    public void onDismiss(DialogInterface dialog) {
          showDialog();
    }


    public synchronized void showDialog() {     
          loadingDialog.show();
    }

错误信息:Actually, there were zero interactions with this mock.

【问题讨论】:

  • 如何注入模拟?你的模拟 mockLoadingDialog 仍然必须与 loadingDialog 对象相同,只是一个模拟版本,否则它如何知道交互?
  • 我正在使用@Mock注解创建模拟对象并通过构造函数依赖注入将它们传递给类
  • 我假设您在 sut 对象上使用 @InjectMocks 进行构造函数注入?

标签: android unit-testing mockito robolectric


【解决方案1】:
package junit;

import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class BasicTest {

    @InjectMocks
    private Basic basic;

    @Mock
    private LoadingDialog mockLoadingDialog;

    @Mock
    private DialogInterface dialog;

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testOnDismiss() {
        basic.onDismiss(dialog);
        verify(mockLoadingDialog, times(1)).show();
    }
}

希望这会有所帮助!

使用@InjectMocks 可确保在必要时注入模拟,而您不必在设置中初始化模拟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多