当前位置: 首页 > 面试题库 >

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

甘西岭
2023-03-14
问题内容

我想模拟下一行:

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

这里的问题是newBigQueryClient方法返回的Bulder类是最终的。这意味着我既不能使用嘲讽也不可以使用powermockito来模拟它(它返回这样的异常:不能对最终类进行子类化),但是我需要返回适合于模拟它的构建方法的东西。有什么想法怎么做?


问题答案:

改善代码并使其更具可测试性的建议:

首先,您不会像您给我们的示例那样模拟 声明 。您可以模拟 对象 并将其引用分配给其类型表示超类型的变量。

另外,如果您觉得自己必须嘲笑某些东西,那么显然您已经在代码片段中找到了一个重要的依赖项。

使这个概念显而易见!

在您的情况下,您想要获取一个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完全受控的模拟对象来实例化您的类。



 类似资料:
  • 问题内容: 我刚刚开始模拟应用程序的不同层。我到了一个地步,我的一个模拟对象在调用最终类静态方法时返回NPE。有没有解决的办法? 例如 问题答案: 您必须同时使用PowerMock和Mockito。 我不明白您的代码段正在尝试做什么,但是以下代码段允许类的静态方法返回模拟的对象。也许这会为您指明正确的方向 在课堂上: 在您的测试方法中:

  • 有没有办法测试以下类,模拟私有方法getMessage()? 我尝试过jUnit Mockito PowerMock,但我找不到一种方法(无需修改源代码或进行反射更改)。 有什么想法吗?

  • 我编写了以下代码来模拟一个名为ValidatorUtil的类,该类在测试中用于验证字符串,所以我编写了ValidatorUtil应该总是返回true,但它总是返回false,最终实际上调用了ValidatorUtil的isValid方法,该方法将结果返回为false。我已经尝试过所有的匹配器,比如mockito.any()和mockito.any(configurator.class)但是没有成功

  • 如何模拟返回已强制转换的模拟对象的方法。 试验方法。

  • 我有最后一节课。 org.mockito.exceptions.base.MockitoExc0019:不能模拟/间谍类改造2.响应Mockito不能模拟/监视以下内容:-最终类-匿名类-原始类型 如何使用Powermockito模拟响应类?

  • 我试图模拟一个单例类(SessionDataManager),通过调用静态getInstance()方法获得一个实例,但所有尝试似乎都返回null。 我试过了