spring data对dao进行测试

数据库中的表

img


dao类


//组件
@Repository
public class TuserDaoImpl implements TuserDao {
    Connection connection = JDBCUtils.getConnection();
    //注入模板对象
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /*** sqring更改
     * 用户登录
     * @param username
     * @param password
     * @return
     */
    @Override
    public Tuser login(String username, String password) {
        String sql = "select id,username,password,email,role,flag,supercar from t_user where username=? and password=?";
        // 处理成RS结果集对象,查询单条数据用queryForObject,集合用query
        Tuser tuser = jdbcTemplate.queryForObject(sql,
                (ResultSet rs, int rowNUm) -> {
                    return new Tuser(rs.getInt("id"),
                            rs.getString("username"),
                            rs.getString("password"),
                            rs.getString("email"),
                            rs.getInt("role"),
                            rs.getInt("flag"),
                            rs.getInt("supercar")
                    );
                }
                , username, password);
        if(tuser==null) return null;
        return tuser;
    }
}

第一次测试类,本次测试输入的是正确的用户名和密码,返回的是一个对象

//测试类包目录 要和 容器类一样
//单元测试类
//指定当前测试环境为spring测试环境
@RunWith(SpringJUnit4ClassRunner.class)
// Context: 容器,上下文
@ContextConfiguration(classes = {AppConfig.class})
public class LoginTest {
    @Autowired
    private TuserDaoImpl tuserDao;
    @Test
    public void login(){
    
        Tuser login = tuserDao.login("燃烧的西瓜", "e10adc3949ba59abbe56e057f20f883e");
        System.out.println(login);
    }
}

第一次测试类结果

img


=重点来了

第二次测试类,输入错误的用户名或密码,会出现报错

//测试类包目录 要和 容器类一样
//单元测试类
//指定当前测试环境为spring测试环境
@RunWith(SpringJUnit4ClassRunner.class)
// Context: 容器,上下文
@ContextConfiguration(classes = {AppConfig.class})
public class LoginTest {
    @Autowired
    private TuserDaoImpl tuserDao;
    @Test
    public void login(){
        //dao中如果是错的用户名,该怎么不出现报错,而显示一个null
        Tuser login = tuserDao.login("燃烧的西瓜1", "e10adc3949ba59abbe56e057f20f883e");
        System.out.println(login);
    }
}

img


报错图片

img

问:如果我在第二次测试类中,故意输入错误的用户名,会出现报错,如何让输入错误了用户名或密码不进行报错,
而是返回一个null

你用 jdbcTemplate 的 queryForObject 方法,查询无数据,或者多条都会抛出异常的。
建议使用 query 方法自己来处理结果集,就能分别处理返回为空、1条、多条的情况。

【以下回答由 GPT 生成】

要在LoginTest测试类中编写测试逻辑来测试TuserDaoImpllogin方法,你可以按照以下步骤进行操作:

  1. 创建一个TuserDao的模拟对象。在LoginTest类中使用@Mock注解创建一个TuserDao的模拟对象,并使用@InjectMocks注解将其注入到TuserDaoImpl实例中。
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
public class LoginTest {
    @InjectMocks
    private TuserDaoImpl tuserDao;

    @Mock
    private TuserDao tuserDaoMock;

    // ...
}
  1. 使用Mockito框架模拟数据库查询结果。在testLogin方法中,使用Mockito框架的when...thenReturn语句来模拟数据库查询结果,并指定期望的返回值。
@Test
public void testLogin() {
    // 模拟数据库查询结果
    when(tuserDaoMock.login("username", "password")).thenReturn(new Tuser(
        1, "username", "password", "email", 1, 0, 1
    ));

    // 测试逻辑
}
  1. 调用TuserDaoImpllogin方法,并校验返回结果。在测试逻辑中,调用TuserDaoImpllogin方法,并使用Assert类来校验返回结果是否符合预期。
@Test
public void testLogin() {
    // 模拟数据库查询结果
    when(tuserDaoMock.login("username", "password")).thenReturn(new Tuser(
        1, "username", "password", "email", 1, 0, 1
    ));

    // 调用TuserDaoImpl的login方法
    Tuser result = tuserDao.login("username", "password");

    // 校验返回结果是否符合预期
    assertNotNull(result);
    assertEquals("username", result.getUsername());
    assertEquals("password", result.getPassword());
    // ... 其他属性的校验
}

请注意,由于TuserDaoImpl类中的Connection属性是在类初始化时创建的,而不是通过Spring容器注入的,因此在测试中需要通过模拟对象来处理相关的方法调用。

这是一个基本的测试逻辑示例,你可以根据需要添加更多的测试案例和校验代码来完善测试覆盖度。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^