我想模仿下一行:
Bigquery bigquery = Transport.newBigQueryClient(options).build();
这里的问题是newBigQueryClient方法返回Bulder类,这是最终的。这意味着我不能用mockito或powermockito来模拟它(它返回这样的异常:不能继承最终类),但我需要返回一些适合于模拟构建方法的东西。任何想法怎么做?
答案 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
来实例化您的课程。