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.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With