This example shows how to write junit to test Spring RowMapper functionality while mocking JdbcTemplate with Mockito.
This also increases code coverage of RowMapper code.
Below is the DAO class that returns list of users with RowMapper using Lambdas.
Spring JdbcTemplate RowMapper Example with Lambdas
package com.kswaughs.dao; import java.sql.ResultSet; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import com.kswaughs.beans.User; @Repository public class UserDAO { @Autowired private JdbcTemplate jdbcTemplate; public List<User> getAllUsers() { return jdbcTemplate.query("SELECT ID, NAME, STATUS FROM USER", (ResultSet rs, int rowNum) -> { User user = new User(); user.setId(rs.getInt("ID")); user.setName(rs.getString("NAME")); user.setStatus(rs.getBoolean("STATUS")); return user; }); } }
Below is the Junit test class to test RowMapper code by mocking JdbcTemplate to return two rows.
Spring JdbcTemplate RowMapper Junit test example
package com.kswaughs.dao; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import com.kswaughs.beans.User; @RunWith(MockitoJUnitRunner.class) public class UserDAOTest { @Mock private JdbcTemplate jdbcTemplate; @InjectMocks private UserDAO userDAO; @SuppressWarnings("unchecked") @Test public void testGetAllUsers() { Mockito.when(jdbcTemplate.query( ArgumentMatchers.anyString(), ArgumentMatchers.any(RowMapper.class))) .thenAnswer((invocation) -> { RowMapper<User> rowMapper = (RowMapper<User>) invocation.getArgument(1); ResultSet rs = Mockito.mock(ResultSet.class); // Mock ResultSet to return two rows. Mockito.when(rs.getInt(ArgumentMatchers.eq("ID"))) .thenReturn(506, 400); Mockito.when(rs.getString(ArgumentMatchers.eq("NAME"))) .thenReturn("Jim Carrey", "John Travolta"); Mockito.when(rs.getBoolean(ArgumentMatchers.eq("STATUS"))) .thenReturn(true, false); List<User> users = new ArrayList<>(); users.add(rowMapper.mapRow(rs, 0)); users.add(rowMapper.mapRow(rs, 1)); return users; }); List<User> users = userDAO.getAllUsers(); // Assert First Row assertFirstUser(users.get(0)); // Assert Second Row assertSecondUser(users.get(1)); } public void assertFirstUser(User user) { Assert.assertEquals(Integer.valueOf(506), user.getId()); Assert.assertEquals("Jim Carrey", user.getName()); Assert.assertTrue(user.isStatus()); } public void assertSecondUser(User user) { Assert.assertEquals(Integer.valueOf(400), user.getId()); Assert.assertEquals("John Travolta", user.getName()); Assert.assertFalse(user.isStatus()); } }