I want to mock the ResultSet
in a class, whose parameters come from a generic return function (getSQLValue
):
public class MyClass{ TableClass clsTableClass; public void getResults(Integer index, Integer value, String str) throws SQLException { try (ResultSet rsResult = clsTableClass.getRecords( getSQLValue(index, value, -1), getSQLValue(index, str, ""))) { // do stuff } } private <T> T getSQLValue(Integer index, T t, T def) { return (index> 0) ? def : t; } }
The table class with the signature method:
public class TableClass { public ResultSet getRecords(Integer value, String str) { // do stuff }
And this is the unit test class:
public class MyClassTest { @Mock(name = "clsTableClass") TableClass clsTableClass; @InjectMocks MyClass clsMyClass; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); } @Test public void testClass() throws Exception { ResultSet rsResult = Mockito.mock(ResultSet.class); when( clsTableClass.getRecords( any(Integer.class), any(String.class)).thenReturn(rsResult); } }
The problem is that the ResultSet
is always null, I can confirm when debugging.
Advertisement
Answer
Turns out that Mockito
, after “accepting” the first argument as Integer, fails to aceppt the second argument as String. The solution (after much debugging) is to cast the any()
matcher in the test function to the corresponding class type:
@Test public void testClass() throws Exception { ResultSet rsResult = Mockito.mock(ResultSet.class); when(clsTableClass.getRecords( (Integer) any(), (String) any()).thenReturn(rsResult); }
Now Mockito
will match the parameters and the ResultSet
will no longer return null
.