java – 使用Mockito的ArgumentCaptor类来匹配子类
发布时间:2020-12-15 01:02:35 所属栏目:Java 来源:网络整理
导读:以下代码显示了我的问题.实际上,我正在尝试使用Mockito的ArgumentCaptor来验证方法是否使用某个具体类调用一次.如果可能的话,我想在这里使用ArgumentCaptor,但我开始怀疑我需要使用自定义的ArgumentMatcher. 问题是线Mockito.verify(模拟).receive(captor.ca
以下代码显示了我的问题.实际上,我正在尝试使用Mockito的ArgumentCaptor来验证方法是否使用某个具体类调用一次.如果可能的话,我想在这里使用ArgumentCaptor,但我开始怀疑我需要使用自定义的ArgumentMatcher.
问题是线Mockito.verify(模拟).receive(captor.capture()); (编辑:将此添加到下面的代码中)失败并出现TooManyActualInvocations异常(2而不是1).我想了解为什么会发生这种情况 – Mockito的执行效果不佳还是由于泛型的类型擦除造成的限制? public class FooReceiver { public void receive(Foo foo) { } } public interface Foo { } public class A implements Foo { } public class B implements Foo { } public class TestedClass { private FooReceiver receiver; public TestedClass(FooReceiver receiver) { this.receiver = receiver; } public void doStuff() { receiver.receive(new A()); receiver.receive(new B()); } } public class MyTest { @Test public void testingStuff() { // Setup FooReceiver mocked = Mockito.mock(FooReceiver.class); TestedClass t = new TestedClass(mocked); // Method under test t.doStuff(); // Verify ArgumentCaptor<B> captor = ArgumentCaptor.forClass(B.class); Mockito.verify(mocked).receive(captor.capture()); // Fails here Assert.assertTrue("What happened?",captor.getValue() instanceof B); } } 编辑: // Verify final B[] b = new B[1]; ArgumentMatcher<B> filter = new ArgumentMatcher<B>() { @Override public boolean matches(Object argument) { if(argument instanceof B) { b[0] = (B) argument; return true; } return false; } } Mockito.verify(mocked).receive(Mockito.argThat(filter)); 解决方法
您还可以使用Mockito.isA来验证参数是否属于特定类:
verify(mock).init(isA(ExpectedClass.class)); Mockito JavaDoc (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |