3

我正在尝试在 Spring 项目中测试一个类。我想在测试类与 dao 类中进行尽可能多的更改,这样我就不必因为更改而重新测试各种事情。

我正在使用的类有一个JdbcTemplate template由以下实例化的类变量:

setJdbcTemplate(DataSource dataSource) {
    this.template = new JdbcTemplate(dataSource);
}

我想测试的方法是template.query(<code>)运行定义的 SQL 查询并将结果返回到列表。

我在我的测试用例中创建了以下内容,但我不确定如何使用它。我可以使用 Mockito 使以下代码返回某个字符串列表吗?

DataSource mockedDataSrc = Mockito.mock(DataSource.class);
customerClassDao.setJdbcTemplate(mockedDataSrc); 

我可以以某种方式使用when或其他命令来设置我想要返回给 JdbcTemplate 的.query调用吗?

4

2 回答 2

4

如果您正在测试 DAO,那么模拟数据源根本没有意义。你在测试什么?您需要创建一个与数据库交互的 DAO。

一旦你完成了这项工作,你就可以在测试使用它的服务时自由地模拟基于接口的 DAO。你已经测试了 DAO;测试服务时没有理由重做。

如果您在测试 DAO 时模拟数据源,我会说您偏离了轨道。

于 2013-03-27T20:41:41.070 回答
2

您不能这样做,因为您无法控制JdbcTemplate实施。您应该依赖注入JdbcTemplate然后模拟JdbcTemplate

这个困难是指出您的代码存在问题。您的代码取决于JdbcTemplate. 如果你在它上面使用依赖注入,它的耦合会更少。


由于您不想修改被测系统,您可以这样做:

更改该template字段,使其受到包保护(即:删除 private 关键字)。然后,在您实例化您正在测试的类之后,我会将其设置为模拟(JdbcTemplate.class)。现在您将能够像您最初想要的那样直接在 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);                
}

// ...
于 2013-03-27T20:01:06.367 回答