【发布时间】:2018-06-20 16:57:43
【问题描述】:
这是类的方法,我想用 mockito 编写单元测试用例
@Repository
public class EmployeeDaoImpl implements EmployeeDao {
@Autowired
DataSource dataSource;
// private static Logger log = Logger.getLogger(UserDaoImpl.class);
public void insertData(Employee emp) {
String sql = "INSERT INTO Emp"
+ "(first_name,last_name, gender, city) VALUES (?, ?, ?,?)";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(
sql,
new Object[] { emp.getFirstName(), emp.getLastName(),
emp.getGender(), emp.getCity() });
}
|
下面我写了我的测试用例方法:
@Test
public void insertDataTest() {
Employee emp= new Employee();
emp.setUserId(1);
emp.setFirstName("Somya");
emp.setLastName("Kumari");
emp.setGender("female");
emp.setCity("Bangalore");
jdbcTemplate = new JdbcTemplate(dataSource);
int var = 0;
Mockito.when(jdbcTemplate.update(Mockito.anyString(),
Mockito.anyVararg())).thenReturn(var);
empDao.insertData(emp);
withSuccess();
}
这是我遇到的错误,请帮助我。
【问题讨论】:
-
我还不能完全预测错误的原因,因为 Mockito 可能有点神秘,但我不认为这对你有用。
jdbcTemplate在你的测试用例中不是一个模拟对象,所以我认为你最终会得到一些关于无法从非模拟返回模拟值的异常。 -
另外,测试中的
JdbcTemplate与代码中的不同。你可以随心所欲地模拟它,但它不会改变被测代码的行为,它正在创建一个全新的JdbcTemplate。您可能想使用一些依赖注入来操作在测试代码中实际使用的对象。 -
你能澄清一下你到底想测试什么吗?当您将
Employee传递给insertData时,会调用jdbcTemplate.update? -
我也不熟悉
withSuccess。看起来它可能来自 Spring,但即便如此,这也不是它的正常用法。 -
JdbcTemplate 是线程安全的,因此不是自动连接数据源,而是自动连接 JdbcTemplate。这避免了代码必须创建一个新的 JdbcTemplate 实例,并且还通过注入一个模拟 JdbcTemplate 来简化测试。然后简单地验证模拟 JdbcTemplate 是使用预期参数调用的。