当前位置: 首页 > 面试题库 >

使用Mockito模拟JdbcTemplate的数据源

单琛
2023-03-14
问题内容

我正在尝试在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模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?

  • 问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。

  • 问题内容: 有没有一种使用通用参数模拟类的干净方法?说我必须模拟一个类,我需要将该类传递给需要一个的方法。我可以很容易地做到以下几点: 假定返回通用类型。但是,当我稍后将其传递给期望的方法时,将会有小猫。铸造是这样做的唯一方法吗? 问题答案: 我认为您确实需要强制转换,但应该不会太糟:

  • 问题内容: 根据Spring 文档,使用Spring JdbcTemplate的步骤如下: 然后, 基本上,JdbcTemplate是使用数据源的setter在Component类内部创建的。 这样做有什么问题,因此应用程序中只有一个jdbcTemplate实例吗? 然后将jdbcTemplate本身直接注入到组件中 有没有理由不能将jdbcTemplate本身直接注入到组件类中? SGB 问题答

  • 我有一个带有私有构造函数的单例类,我想为此编写单元测试。 如何使用mockito框架模拟具有私有构造函数的类。 谢谢