如何在没有实现存根类的情况下为Mockito的界面生成间谍?

时间:2015-09-30 13:30:05

标签: java unit-testing mockito

所以我有以下界面:

public interface IFragmentOrchestrator {
    void replaceFragment(Fragment newFragment, AppAddress address);
}

如何创建spy ArgumentCaptorreplaceFragment()允许我挂钩 IFragmentOrchestrator orchestrator = spy(mock(IFragmentOrchestrator.class)); - 对象调用spy

我试过

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

    }
}

public IFragmentOrchestrator getSpyObject() {
    return spy(new EmptyFragmentOrchestrator());
}

但是,mockito抱怨​​“Mockito只能模拟可见和非最终的类。”

到目前为止,我提出的唯一解决方案是在创建{{1}}之前实现接口的实际模拟。但这种做法违背了嘲弄框架的目的:

{{1}}

我错过了一些基本的东西吗?我一直在查看mockito而没有找到任何东西(但我可能会失明)。

2 个答案:

答案 0 :(得分:1)

间谍是指您希望在现有实施上叠加存根。这里有一个裸接口,所以看起来你只需要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
  }
}

另一方面,如果你真的想要监视一个实现,那么你应该这样做:

IFragmentOrchestrator orchestrator = spy(new IFragmentOrchestratorImpl());

这将调用IFragmentOrchestratorImpl上的实际方法,但仍允许使用verify进行拦截。

答案 1 :(得分:0)

我们可以使用 org.mockito.Mock 注释来做到这一点

import org.mockito.Mock;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.when;

public class Test {
    @Mock
    private TestInterface mockTestInterface;

    @Test
    public void testMethodShouldReturnTestString() {
        String testString = "Testing...";

        when(mockTestInterface.testMethod()).thenReturn(testString);

        assertThat(mockTestInterface.testMethod(), is(testString));
    }

}