使用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);

}

}

您的测试将执行此操作:

@Before

public void setUp() {

SystemUnderTest sut = new SystemUnderTest();

sut.jdbcTemplate = mock(JdbcTemplate.class);

}

// ...

以上是 使用Mockito模拟JdbcTemplate的数据源 的全部内容, 来源链接: utcz.com/qa/421307.html

回到顶部