如何模拟返回最终类的静态方法?
我想模仿下一行:
Bigquery bigquery = Transport.newBigQueryClient(options).build();
这里的问题是newBigQueryClient方法返回Bulder类,这是最终的。 这意味着我不能用mockito或powermockito来模拟它(它返回这样的exception:不能inheritance最终类),但我需要返回一些适合于模拟构建方法的东西。 有什么想法怎么做?
建议改进您的代码并使其更易于测试:
首先,你不要模仿像你给我们的作业那样的陈述作为例子。 您模拟对象并将其引用分配给其类型表示超类型的变量。
此外,如果您觉得必须嘲笑某些东西,您显然在代码片段中发现了一个依赖,这是一个重要的概念。
让这个概念变得明显!
在您的情况下,您希望获取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
来实例化您的类。