RowMapper 的 Spring jdbc 模板的单元测试用例

joh*_*ohn 2 arrays spring unit-testing jdbc spring-boot

我知道为映射器或获取设置编写单元测试不是一件好事,但是,它就是这样,所以我陷入了如何为映射器进行单元测试的困境;

\n

下面的学生组列表;

\n
@Getter\n@Setter\npublic class StudentGroupList {\n\n private String studentId;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

下面的 StudentGroupListRowMapper;

\n
public class StudentGroupListRowMapper implements RowMapper<StudentGroupList> {\n\n  @Override\n  public StudentGroupList mapRow(Resultset rs, int rowNum) throws SQLException {\n\n  StudentGroupList studentGroupList = new StudentGroupList();\n \n  studentGroupList.setStudentId(rs.getString("student_id"));\n\n  return studentGroupList;\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在下面尝试过,但 jococo 覆盖率测试没有覆盖任何内容

\n
   public class TaskGroupListRowMapperTest {\n\n     private ResultSet resultSet;\n     private StudentGroupList studentGroupList;\n\n     @Before\n     public void setUp() {\n     resultSet = mock(ResultSet.class);\n     studentGroupList = mock(StudentGroupList.class);\n    }\n\n    @Test\n    public void testStudentGroupListMapper() throws SQLException {\n     when(resultSet.getString("student_id"))\n    .thenReturn(studentGroupList.getStudentID());\n     \n    assertTrue(studentGroupList.getStudentId(), true);\n    \n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\xc4\xb0t 表示异常;thenReturn() 可能丢失。

\n

Kav*_*lai 5

放松点,我们过去都曾尝试过理解单元测试应该做什么。

  • 您不会仅仅为了单元测试覆盖率而对所有内容进行单元测试。当您有像 RowMapper 这样的框架回调时,这就是其中一种情况。你的代码StudentGroupListRowMapper非常简单,所以对你的 Dao 进行集成测试就可以覆盖它。无论如何,您想要进行单元测试,因此只需将其视为一个简单的类,然后让我们完成这些步骤。

  • 您想要创建要测试的类的实例,并为其调用的任何服务提供模拟依赖项。幸运的是你StudentGroupListRowMapper没有打电话任何东西。由于您要测试的方法是 StudentGroupList mapRow(ResultSet rs, int rowNum),您必须决定是否可以提供 aResultSet和 a rowNum。由于ResultSet不是您创建的东西,您为此提供了一个模拟

    ResultSet inputRs = mock(ResultSet.class);
    int rowNum = 1;
   
Run Code Online (Sandbox Code Playgroud)
  • 现在,当您的方法执行时,它将调用inputRs.getString("student_id")以获取学生 ID,但它是模拟的,并且不知道要返回什么,因此您必须告诉您的模拟在inputRs.getString("student_id")调用时要做什么
   when(inputRs.getString("student_id")).thenReturn("student-id-1");
Run Code Online (Sandbox Code Playgroud)
  • 现在您知道您的预期StudentGroupList应该使用该方法创建"student-id-1"并应该从该方法返回。

assertEquals(resultedStudentGroupList.getStudentId(),"student-id-1");

  • 让我们将它们全部组合在一起。
   public class StudentGroupListRowMapperTest {

    StudentGroupListRowMapper mapper = new StudentGroupListRowMapper();
 
    @Test
    public void testMapRow() {
      ResultSet inputRs = mock(ResultSet.class);
      int rowNum = 1;
      when(inputRs.getString("student_id")).thenReturn("student-id-1");

      StudentGroupList result = mapper.mapRow(inputRs, rowNum);

      assertEquals(result.getStudentId(), "student-id-1");
    }
  }

Run Code Online (Sandbox Code Playgroud)