Android 莫基托可以';t验证子方法调用

Android 莫基托可以';t验证子方法调用,android,unit-testing,mockito,robolectric,Android,Unit Testing,Mockito,Robolectric,我在测试方面有点新手,所以请容忍我 我想测试我的onDismiss()方法的行为。我想确保onDismiss()确实调用showDialog()方法。为此,我想验证是否调用了showDialog()中的mock。 我收到一条错误消息,说没有与该模拟交互。如果我在调试模式下运行它,我会看到我们在loadingDialog.show()行上进行了一步,但仍然会出现此错误 问题: 我想知道,在这种情况下如何测试子方法调用 为什么会这样 (showDialog()已包含在单独的测试中) 测试:

我在测试方面有点新手,所以请容忍我

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

问题:

  • 我想知道,在这种情况下如何测试子方法调用
  • 为什么会这样
(showDialog()已包含在单独的测试中)

测试

      sut.onDismiss(mockDialog)
      verify(mockLoadingDialog, times(1)).show();
    public void onDismiss(DialogInterface dialog) {
          showDialog();
    }


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

      sut.onDismiss(mockDialog)
      verify(mockLoadingDialog, times(1)).show();
    public void onDismiss(DialogInterface dialog) {
          showDialog();
    }


    public synchronized void showDialog() {     
          loadingDialog.show();
    }
错误消息:
实际上,与此模拟没有任何交互。

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可确保在必要时注入模拟,而不必在设置中初始化模拟。

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