Given interface:
public interface Calculator<T extends Integer>
{
void calculate(T a, T b);
}
classes which implement this interface:
public class CalculatorAddition implements Calculator
{
public void calculate(Integer a, Integer b)
{
System.out.println(a + b);
}
}
public class CalculatorSubtraction implements Calculator
{
public void calculate(Integer a, Integer b)
{
System.out.println(a - b);
}
}
and classes that calculate addition and subtraction in the following way:
public class CalculatorFlow
{
public void compute(Calculator calc, Integer a, Integer b)
{
calc.calculate(a, b);
}
}
public class CalculatorFlowCalculations
{
private CalculatorFlow calculatorFlow = new CalculatorFlow();
private CalculatorAddition calculatorAddition = new CalculatorAddition();
private CalculatorSubtraction calculatorSubtraction = new CalculatorSubtraction();
public void doCalculations()
{
int a = 5;
int b = 5;
calculatorFlow.compute(calculatorAddition, a, b);
calculatorFlow.compute(calculatorSubtraction, a , b);
}
}
I'd like to check if the compute method from CalculatorFlow was executed first with CalculatorAddition object and then with CalculatorSubtraction object. Note that compute method takes them as Calculator interface reference. When I do it like that:
@RunWith(MockitoJUnitRunner.class)
public class CalculatorFlowTest
{
@Mock
private CalculatorFlow calculatorFlow;
@InjectMocks
private CalculatorFlowCalculations calculatorFlowCalculations = new CalculatorFlowCalculations();
@Test
public void testDoCalculations()
{
InOrder inOrder = inOrder(calculatorFlow);
calculatorFlowCalculations.doCalculations();
inOrder.verify(calculatorFlow).compute(any(CalculatorAddition.class), anyInt(), anyInt());
inOrder.verify(calculatorFlow).compute(any(CalculatorSubtraction.class), anyInt(), anyInt());
}
}
I get:
org.mockito.exceptions.verification.VerificationInOrderFailure:
Verification in order failure:
calculatorFlow.compute(<any>, <any>, <any>);
Wanted 1 time:
-> at CalculatorFlowTest.testCalc(CalculatorFlowTest.java:27)
But was 2 times. Undesired invocation:
-> at CalculatorFlowCalculations.doCalculations(CalculatorFlowCalculations.java:13)
As I can understand, the method is called twice because of interface type reference in compute method, so my question is: how to check in that case if the method executes in particular order with specific arguments?