Search code examples
javaspring-bootmockitojunit4maven-surefire-plugin

how to mock resultmetadata for junit testing


having one function using resultmetadata.

    ResultSet rs // coming from some sql query.
    ResultSetMetaData rsmd = rs.getMetaData();
    if(rsmd.getColumnName(1).toString().equalsIgnoreCase("something"))
    {
    //do something here
    }

i have mocked resultset before, but dont know how to mock resultmetadata or put desired column name in resultset ? i tried :

    ResultSetMetaData rsmd = Mockito.mock(ResultSetMetaData.class);
    Mockito.when(rsmd.getColumnName(1)).thenReturn("Somwthing");

but it didnt worked


Solution

  • Here is an example of what you need to do:

    import org.mockito.Mockito;
    
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    
    import static org.junit.Assert.assertEquals;
    import static org.mockito.ArgumentMatchers.eq;
    import static org.mockito.Mockito.when;
    
    public class Test {
    
    
        @org.junit.Test
        public void test() throws SQLException {
    
            // prepare the dependant mock
            ResultSetMetaData rsMetaMock = Mockito.mock(ResultSetMetaData.class);
            when(rsMetaMock.getColumnName(eq(1))).thenReturn("something");
    
            // prepare main mock for result set and define when 
            // main mock to return dependant mock
            ResultSet rs = Mockito.mock(ResultSet.class);
            when(rs.getMetaData()).thenReturn(rsMetaMock);
    
            // application logic
            ResultSetMetaData rsmd = rs.getMetaData();
    
            //assertions
            assertEquals(rsmd.getColumnName(1), "something");
        }
    }