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

我想模仿下一行:

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来实例化您的类。