所以我有以下界面:
public interface IFragmentOrchestrator {
void replaceFragment(Fragment newFragment, AppAddress address);
}
如何创建spy
ArgumentCaptor
,replaceFragment()
允许我挂钩 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而没有找到任何东西(但我可能会失明)。
答案 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));
}
}