如何模拟Junit测试的DAO类的jdbcTemplate调用



我有如下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文档(非常全面,但很简单(。

重要提示:不鼓励现场注射。

最新更新