我有如下DAO类:-
//这里我有一个类,它使用new创建自己的jdbcTemplate//jdbcTemplate(dataSource(
@Repository
public class MyDao {
@Autowired
@Qualifier("db2JdbcTemplate)"
JdbcTemplate jdbcTemplateDB2;
public int insertTable(Company comp) {
int ret = 0;
try {
ret = this.jdbcTemplateDB2(db2DataSource).update(ïnsert into "+ table_name + "(COL1,COL2,...) values (?,?,?,..)",
ps-> {
ps.setString(1, comp.getName);
.......
});
return ret;
} catch (Exception ex) {
// log etc
}
}
}
我的测试课程如下:-
@RunWith(MockitoJUnitRunner.class)
public class MyTest {
@Mock
JdbcTemplate jdbcTemplateDB2;
Company comp = new Company(); // this is followed by setter fn to set values.
MyDao mydao = Mockito.mock(MyDao.class);
Mockito.when(((jdbcTemplateDB2.update(any(String.class),
any(PreparedStatement.class))).thenReturn(2);
ReflectionUtils.setField(mydao, "jdbcTemplateDB2", jdbcTemplateDB2);
int bVal = mydao.insertTable(cmp);
}
}
iVal未获得值2。它正在进行原始的更新调用,并返回类似0/1的值。正在获取不必要的管道异常。如果我调用宽大处理((,异常会消失,但结果是一样的(预期宽大处理只会删除警告(。如何使这种存根工作?
在这一行:MyDao mydao = Mockito.mock(MyDao.class);
中,您正在创建一个mock对象,它覆盖了您实际的class'x行为,但您似乎想测试这个类,所以它没有任何意义。您需要做的是:创建该类的一个实际实例,并向其中注入mock(您使用ReflectionUtils
来实现这一点,但Mockito有自己的简单机制来实现(。
@Mock
JdbcTemplate jdbcTemplateDB2;
// this tells mockito to create the object and inject mocks into it
@InjectMocks
MyDao myDao;
@Test
void test() {
// define the behavior for the mock
when(jdbcTemplateDB2.update(...)).thenReturn(2);
// call the actual method of the tested class object (not a mock)
int result = myDao.insertTable(...);
// perform assertions (e.g. verify the result value)
}
推荐阅读:Mockito文档(非常全面,但很简单(。
重要提示:不鼓励现场注射。