数据库中的表
//组件
@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);
}
}
第一次测试类结果
第二次测试类,输入错误的用户名或密码,会出现报错
//测试类包目录 要和 容器类一样
//单元测试类
//指定当前测试环境为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);
}
}
问:如果我在第二次测试类中,故意输入错误的用户名,会出现报错,如何让输入错误了用户名或密码不进行报错,
而是返回一个null
你用 jdbcTemplate 的 queryForObject 方法,查询无数据,或者多条都会抛出异常的。
建议使用 query 方法自己来处理结果集,就能分别处理返回为空、1条、多条的情况。
【以下回答由 GPT 生成】
要在LoginTest
测试类中编写测试逻辑来测试TuserDaoImpl
的login
方法,你可以按照以下步骤进行操作:
TuserDao
的模拟对象。在LoginTest
类中使用@Mock
注解创建一个TuserDao
的模拟对象,并使用@InjectMocks
注解将其注入到TuserDaoImpl
实例中。@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
public class LoginTest {
@InjectMocks
private TuserDaoImpl tuserDao;
@Mock
private TuserDao tuserDaoMock;
// ...
}
Mockito
框架模拟数据库查询结果。在testLogin
方法中,使用Mockito
框架的when...thenReturn
语句来模拟数据库查询结果,并指定期望的返回值。@Test
public void testLogin() {
// 模拟数据库查询结果
when(tuserDaoMock.login("username", "password")).thenReturn(new Tuser(
1, "username", "password", "email", 1, 0, 1
));
// 测试逻辑
}
TuserDaoImpl
的login
方法,并校验返回结果。在测试逻辑中,调用TuserDaoImpl
的login
方法,并使用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容器注入的,因此在测试中需要通过模拟对象来处理相关的方法调用。
这是一个基本的测试逻辑示例,你可以根据需要添加更多的测试案例和校验代码来完善测试覆盖度。