我正在尝试在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框架模拟具有私有构造函数的类。 谢谢