测试传递给私有方法的参数

时间:2018-10-04 19:52:59

标签: junit mocking mockito

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是私有的,

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

对于要测试交互的每个元素,都应使用依赖注入。这是测试的好规则。

或者,您可以考虑是否可以测试jdbccall.execute(parameters)结果,而不仅仅是参数-那将是最好的解决方案。用正确的参数调用execute后系统的状态应该是什么?

假设您正在执行单元测试,并且无法检查execute的结果,那么您应该以某种方式在构造函数中传递类型为SimpleJDBCall的对象。现在有三种可能性:

  1. 创建一个同时包含DataSourceSimpleJDBCall的构造函数-然后您可以执行以下操作:

    public DAO1(@Qualifier("datasource") DataSource dataSource) {
        this(dataSource, createJdbcCall(someparameters))
    }
    
    public DAO1(DataSource dataSource, SimpleJDBCall jdbccall) {
        this.jdbccall = jdbccall
    }
    
  2. 修改构造函数,并将自动连线的SimpleJDBCall添加到您的容器中(但使用jdbCall名称,我认为这不是简单的解决方案)

  3. 使用可以创建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);
    }
    

不要害怕出于测试目的而修改您的类-如果它不是可测试的,也许一开始设计得不好?