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

Java 如何模拟返回最终类的静态方法?,java,junit,Java,Junit,我想模仿下一行: Bigquery bigquery = Transport.newBigQueryClient(options).build(); 这里的问题是newBigQueryClient方法返回Bulder类,这是最终的。这意味着我既不能用mockito也不能用powermockito模拟它(它返回这样的异常:不能子类化final类),但我需要返回适合于它的mock build方法的东西。有什么想法吗?改进代码并使其更易于测试的建议: 首先,你不要模仿你给我们的作业作为例子的陈述。您

我想模仿下一行:

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

这里的问题是newBigQueryClient方法返回Bulder类,这是最终的。这意味着我既不能用mockito也不能用powermockito模拟它(它返回这样的异常:不能子类化final类),但我需要返回适合于它的mock build方法的东西。有什么想法吗?

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

首先,你不要模仿你给我们的作业作为例子的陈述。您可以模拟对象并将其引用分配给类型表示超类型的变量

此外,如果您觉得必须模仿某些东西,那么很明显,您在代码片段中发现了一个依赖项,这是一个重要的概念

让这个概念变得显而易见

在本例中,您希望获取一个
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
来实例化类。

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

首先,你不要模仿你给我们的作业作为例子的陈述。您可以模拟对象并将其引用分配给类型表示超类型的变量

此外,如果您觉得必须模仿某些东西,那么很明显,您在代码片段中发现了一个依赖项,这是一个重要的概念

让这个概念变得显而易见

在本例中,您希望获取一个
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
来实例化类。

可以扩展
BigQuery
吗(对于类)或实现吗(对于接口)?为什么不创建它的实例并返回它呢?它是一个类,并且可以扩展它@SeelenvirtuoseIf如果我在newBigQueryClient方法(构建器对象)之后返回一个实例,那么我将无法进一步模拟它@AribeiRoi如果使用powerMock是一个选项,那么这可能是有用的
BigQuery
可以扩展(对于类)或实现(对于接口)?为什么不创建它的实例并返回它呢?它是一个类,可以扩展它@SeelenvirtuoseIf如果我在newBigQueryClient方法(构建器对象)之后返回一个实例,那么我将无法进一步模拟它@如果使用powerMock是一个选项,这可能会很有用