使用Mockito模拟JdbcTemplate的数据源
我正在尝试在Spring项目中测试一个类。我想在测试类和dao类中进行尽可能多的更改,这样我就不必因为更改而重新测试所有类型的东西。
我正在使用的JdbcTemplate template
类具有通过以下实例化的类变量:
setJdbcTemplate(DataSource dataSource) { this.template = new JdbcTemplate(dataSource);
}
我想测试的方法使a template.query(<code>)
运行定义的SQL查询并将结果返回到列表。
我在测试用例中创建了以下内容,但不确定如何使用它。我可以使用Mockito使以下代码返回特定的字符串列表吗?
DataSource mockedDataSrc = Mockito.mock(DataSource.class);customerClassDao.setJdbcTemplate(mockedDataSrc);
我可以以某种方式使用when
或其他命令来设置要返回给JdbcTemplate .query
调用的内容吗?
回答:
您无法执行此操作,因为您无法控制JdbcTemplate
实现。您应该依赖注入JdbcTemplate
,然后模拟JdbcTemplate
。
这个困难指出了您的代码有问题。您的代码取决于的具体实例JdbcTemplate
。如果您对它使用依赖注入,则耦合度会降低。
由于您不想修改被测系统,因此可以执行以下操作:
更改template
字段,使其受到程序包保护(即:删除private关键字)。然后,在实例化要测试的类之后,将其设置为模拟(JdbcTemplate.class)。现在,您将能够像最初想要的那样直接使用when并在JdbcTemplate上进行验证。
因此,您正在测试的类将如下所示:
public class SystemUnderTest {JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(DataSource dataSource) {
this.template = new JdbcTemplate(dataSource);
}
}
您的测试将执行此操作:
@Beforepublic void setUp() {
SystemUnderTest sut = new SystemUnderTest();
sut.jdbcTemplate = mock(JdbcTemplate.class);
}
// ...
以上是 使用Mockito模拟JdbcTemplate的数据源 的全部内容, 来源链接: utcz.com/qa/421307.html