如何在不实现存根类的情况下为 Mockito 的接口生成间谍?

Nil*_*zor 5 java unit-testing mockito

所以我有以下界面:

public interface IFragmentOrchestrator {
    void replaceFragment(Fragment newFragment, AppAddress address);
}
Run Code Online (Sandbox Code Playgroud)

如何spy使用mockito创建一个允许我将ArgumentCaptor-objects挂钩到调用的对象replaceFragment()

我试过

    IFragmentOrchestrator orchestrator = spy(mock(IFragmentOrchestrator.class));
Run Code Online (Sandbox Code Playgroud)

但是 mockito 抱怨“Mockito 只能模拟可见和非 final 类。”

到目前为止,我想出的唯一解决方案是在创建spy. 但这违背了模拟框架的目的:

public static class EmptyFragmentOrchestrator implements IFragmentOrchestrator {
    @Override
    public void replaceFragment(Fragment newFragment, AppAddress address) {

    }
}

public IFragmentOrchestrator getSpyObject() {
    return spy(new EmptyFragmentOrchestrator());
}
Run Code Online (Sandbox Code Playgroud)

我错过了一些基本的东西吗?我一直在浏览文档但没有找到任何东西(但我可能是瞎的)。

小智 3

间谍是指您想要在现有实现上覆盖存根。这里你有一个裸露的界面,所以看起来你只需要mock

public class MyTest {
  @Captor private ArgumentCaptor<Fragment> fragmentCaptor;
  @Captor private ArgumentCaptor<AppAddress> addressCaptor;

  @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void testThing() {
    IFragmentOrchestrator orchestrator = mock(IFragmentOrchestrator.class);

    // Now call some code which should interact with orchestrator 
    // TODO

    verify(orchestrator).replaceFragment(fragmentCaptor.capture(), addressCaptor.capture());

    // Now look at the captors
    // TODO
  }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您确实想监视某个实现,那么您应该这样做:

IFragmentOrchestrator orchestrator = spy(new IFragmentOrchestratorImpl());
Run Code Online (Sandbox Code Playgroud)

这将调用 上的实际方法IFragmentOrchestratorImpl,但仍然允许拦截verify.