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

如何测试实用程序项目的最终方法和静态方法?

乐正宜人
2023-03-14
问题内容

我正在尝试为一个项目实施单元测试,它使用了一个遗留有静态方法的旧式“实用程序”项目,并且许多类是最终的,或者它们的方法是最终的。我根本无法更新旧项目。

JMock和EasyMock都限制了最终方法,我看不到测试静态调用的好方法。有哪些技术可以测试这些?


问题答案:

如果您能够重构代码,则可以将对final / static方法的调用包装在简单的实例方法中,例如:

protected Foo doBar(String name) {
    return Utility.doBar(name);
}

这使您可以在单元测试中覆盖包装方法,以返回Foo的模拟实例。

另外,您可以使用Powermock,它扩展了Easymock(和Mockito)以允许模拟final和static方法:

PowerMock是一个框架,它以更强大的功能扩展了其他模拟库,例如EasyMock。PowerMock使用自定义的类加载器和字节码操作来对静态方法,构造函数,最终类和方法,私有方法,静态初始化程序的删除等进行模拟。

这是一个模拟静态final方法的示例测试,该示例还显示了如何模拟其他一些类型:

@Test
public void testMockStaticFinal() throws Exception {
    mockStatic(StaticService.class);
    String expected = "Hello altered World";
    expect(StaticService.sayFinal("hello")).andReturn("Hello altered World");
    replay(StaticService.class);

    String actual = StaticService.sayFinal("hello");

    verify(StaticService.class);
    assertEquals("Expected and actual did not match", expected, actual);

    // Singleton still be mocked by now.
    try {
        StaticService.sayFinal("world");
            fail("Should throw AssertionError!");
    } catch (AssertionError e) {
        assertEquals("\n  Unexpected method call sayFinal(\"world\"):", 
            e.getMessage());
    }
}


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

  • 问题内容: 阅读并学习单元测试,尝试理解下面的文章,该文章解释了静态函数调用的困难。 我不清楚这个问题。我一直认为静态函数是在类中舍入实用函数的一种好方法。例如,我经常使用静态函数调用进行初始化,即: //阅读这篇文章后,我现在的目标是… 但是,我为此课程编写的几十个测试是相同的。我什么都没改变,他们仍然都过去了。难道我做错了什么? 该帖子的作者指出: 静态方法的基本问题是它们是过程代码。 我不知

  • 问题内容: 我想模拟下一行: 这里的问题是newBigQueryClient方法返回的Bulder类是最终的。这意味着我既不能使用嘲讽也不可以使用powermockito来模拟它(它返回这样的异常:不能对最终类进行子类化),但是我需要返回适合于模拟它的构建方法的东西。有什么想法怎么做? 问题答案: 改善代码并使其更具可测试性的建议: 首先,您不会像您给我们的示例那样模拟 声明 。您可以模拟 对象

  • 嗨,我真的希望你能帮助我,我感觉我的头发已经拔了好几天了。 我正在尝试为一个方法a编写单元测试。方法a调用一个静态方法B。我想模拟静态方法B。 我知道以前有人问过这个问题,但我感觉Android从那以后已经成熟了,肯定有一种方法可以做到这么简单的任务,而不用重新编写我想测试的方法。 在其他语言中这是如此容易,但我就是无法使它在Android中工作。我试过Mockito,但似乎不支持静态方法 此错误

  • 问题内容: 是否可以通过任何常规方法或规则来确保专门用于任何应用程序的各种Utility类的静态方法的线程安全性。在这里,我想特别指出Web应用程序的线程安全性。 众所周知,以不可变对象作为参数的静态方法是线程安全的,而可变对象不是。 如果我有一个实用程序方法可用于的某些操作,并且该方法接受的实例,则该方法将不是线程安全的。那么如何在不更改参数传递方式的情况下使其成为线程安全的呢? 课堂也是可变的

  • 我需要junit测试一段代码,但它从不同类调用的GsonConverter是静态方法,我无法更改。我不知道如何进行,因为我不能嘲笑它,因为它是静态的。 下面是带有静态方法的类