简体   繁体   中英

Mockito thenReturn returns null when coming from generic function

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM