如何模拟返回最终类的静态方法?

时间:2016-03-23 12:36:15

标签: java junit

我想模仿下一行:

Bigquery bigquery = Transport.newBigQueryClient(options).build();

这里的问题是newBigQueryClient方法返回Bulder类,这是最终的。这意味着我不能用mockito或powermockito来模拟它(它返回这样的异常:不能继承最终类),但我需要返回一些适合于模拟构建方法的东西。任何想法怎么做?

1 个答案:

答案 0 :(得分:2)

建议改进代码并使其更易于测试:

首先,您不要模拟语句,就像您给我们的作业一样。您模拟对象并将其引用分配给类型代表超类型的变量。

此外,如果你觉得你必须嘲笑某些东西,你很明显在你的代码片段中发现了一个依赖,这是一个重要的概念。

让这个概念变得明显!

在您的情况下,您希望获得Bigquery对象并将其引用分配给变量。不明确的概念是有人必须提供这样的对象。

通过界面明确这个概念:

interface BigqueryProvider {
    Bigquery provide(Object options);
}

在您的班级中,您也有声明

Bigquery bigquery = Transport.newBigQueryClient(options).build();

现在添加以下实例变量

private final BigqueryProvider bigqueryProvider;

并相应地更改构造函数。当我做final时,它必须在施工时设置。当然,您还必须确定调用构造函数的代码。为此,您还需要一个默认实现:

final class DefaultBigqueryProvider implements BigqueryProvider {
    @Override
    public Bigquery provide(Object options) {
        return Transport.newBigQueryClient(options).build();
    }
}

然后将上述作业更改为

Bigquery bigquery = bigqueryProvider.provide(options);

现在进行测试:在测试中,您现在可以为提供程序接口提供测试实现。模拟框架可以轻松地为您完成。您还可以返回您选择的Bigquery对象,作为该类或子类的对象,它并不重要。

然后,您的测试代码会通过为您提供一个完全控制的模拟BigqueryProvider来实例化您的课程。