Java – use mockito’s argumentcaptor class to match subclasses
•
Java
The following code shows my problem In fact, I'm trying to use mockito's argumentcaptor to verify whether a method is called once with a specific class If possible, I want to use argumentcaptor here, but I'm beginning to doubt that I need to use a custom argumentmatcher
The problem is the line mockito Verify receive(captor.capture()); (edit: add this to the following code) fails with toomanyactualinvocations exception (2 instead of 1) I want to know why this happens – is mockito performing poorly or is it limited by the type erasure of generics?
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); } }
Editor: for anyone interested, I finally did this:
// 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));
Solution
You can also use mockito Isa to verify whether the parameter belongs to a specific class:
verify(mock).init(isA(ExpectedClass.class));
Mockito JavaDoc
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码