public class DAO1 {
private SimpleJDBCall jdbccall;
@Autowired
public DAO1(@Qualifier("datasource") DataSource dataSource) {
jdbccall = createJdbcCall(someparameters)
}
public Response fetch(parameters){
jdbccall.execute(parameters);
}
}
我要测试此DAO1类,主要是如果执行方法是使用某些参数执行的, 知道这是否可能吗?
我知道我们可以将参数捕获器用于公共方法, 但是SimpleJDBCall是私有的,
有什么想法吗?
答案 0 :(得分:0)
对于要测试交互的每个元素,都应使用依赖注入。这是测试的好规则。
或者,您可以考虑是否可以测试jdbccall.execute(parameters)
的结果,而不仅仅是参数-那将是最好的解决方案。用正确的参数调用execute
后系统的状态应该是什么?
假设您正在执行单元测试,并且无法检查execute
的结果,那么您应该以某种方式在构造函数中传递类型为SimpleJDBCall
的对象。现在有三种可能性:
创建一个同时包含DataSource
和SimpleJDBCall
的构造函数-然后您可以执行以下操作:
public DAO1(@Qualifier("datasource") DataSource dataSource) {
this(dataSource, createJdbcCall(someparameters))
}
public DAO1(DataSource dataSource, SimpleJDBCall jdbccall) {
this.jdbccall = jdbccall
}
修改构造函数,并将自动连线的SimpleJDBCall
添加到您的容器中(但使用jdbCall名称,我认为这不是简单的解决方案)
使用可以创建SimpleJDBCall
的对象修改构造函数(或添加另一个构造函数)-它可能是工厂的,可能是简单的函数:
public DAO1(@Qualifier("datasource") DataSource dataSource, Supplier<SimpleJDBCall> jdbcCallCreator) {
jdbccall = jdbcCallCreator.get();
}
或者,如果需要参数:
public DAO1(@Qualifier("datasource") DataSource dataSource, Function<ArgumentType, SimpleJDBCall> jdbcCallCreator) {
jdbccall = jdbcCallCreator.apply(arguments);
}
不要害怕出于测试目的而修改您的类-如果它不是可测试的,也许一开始设计得不好?