单元测试验证是否调用了伴生对象方法(模拟伴生对象)

2024-04-13

当切换到 Kotlin 时,静态方法被移至伴生对象中。但是,没有明显的方法来对调用这些“静态方法”的其他方法进行单元测试。

在Java中,我们可以使用PowerMockito的MockStatic(SomeClass.class)来验证被测方法中是否调用了静态方法。 PowerMock 在 Kotlin 中失去了魔力。

为了进行测试,我创建了以下类。

public class DummyJava {
    static public Void staticMechod(){
          System.out.print("Dummy method is called");
          return null;
     }
}

class DummyCompanion {
    companion object {
        fun someCompanionMethod(){
            System.out.printf("companion method is called\n")
        }
    }
}

现在有另一个类称为DummyCompanion.someCompanion

public class DummyWrapper {
    public void callAStaticMethod(){
        DummyJava.staticMechod();
    }

    public void callCompanionMethod(){
        DummyCompanion.Companion.someCompanionMethod();
    }
}

进行单元测试callAStaticMethod()我们使用了以下内容

@RunWith(PowerMockRunner.class)
@PrepareForTest({DummyJava.class, DummyCompanion.Companion.class})
public class staticClassTest {
    //This case works
    @Test 
    public void testForStaticMethod() {
        PowerMockito.mockStatic(DummyJava.class);   
        DummyWrapper testObject = new DummyWrapper();

        Mockito.when(DummyJava.staticMechod()).thenCallRealMethod();

        testObject.callAStaticMethod();

        PowerMockito.verifyStatic(Dummy.class);
        DummyJava.staticMechod();
    }

    //This case doesn't work. It always passes.
    @Test
    public void testForCompanionMethod() {
        PowerMockito.mockStatic(DummyCompanion.Companion.class);
        DummyWrapper testObject = new DummyWrapper();
        testObject.callCompanionMethod();
PowerMockito.verifyStatic(DummyCompanion.Companion.class,Mockito.times(1));
        DummyCompanion.Companion.someCompanionMethod();
}

我的问题是如何验证调用了伴随方法。


解决方案1:在调用类中添加调用者函数

class DummyWrapper {
  val foo get() = DummyCompanion.Companion

  fun callAStaticMethod() {
    foo.staticMethod()
  }

  fun callCompanionMethod(){
    foo.someCompanionMethod();
  }
}

在测试类中,我们可以使用 Mockito 提供一个存根get()函数并验证它被调用。

@Test
fun testCase() {
  ....
  val mockCompanionObj: DummyCompanion.Companion = mock()
  val wrapper = DummyWrapper()

  whenever(wrapper.foo).thenReturn(mockCompanionObj)
  wrapper.callCompanionMethod()
  verify(mockCompanionObj).someCompanionMethod()
  ....
}

解决方案2:使用Mockk在 Mockk 中模拟伴随对象很容易。无需在源代码中插入测试接口对象。

@Test
fun testCompanionObject() {
  // Mock the companion object
  mockkObject(DummyCompanion.Companion)

  // Define the stubbing behavior of a companion object method
  every { DummyCompanion.someCompanionMethod() } answers { stubMethod() }

  val testObject = DummyWrapper()

  // Call a method that calls the companion object method
  // You can verify stubMethod() is called
  testObject.callCompanionMethod()

  verify(exactly = 1) { DummyCompanion.someCompanionMethod() }
}

详情请参阅Mockk https://mockk.io

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试验证是否调用了伴生对象方法(模拟伴生对象) 的相关文章

随机推荐

  • 使用 C# 和 ASP.Net 设置 type="password" 的输入标记的值

    所以我有这个输入标签
  • onclick 或内联脚本在扩展中不起作用

    这似乎是最简单的事情 但它就是行不通 在普通浏览器中 html 和 js 文件可以完美运行 但在 Chrome Firefox 扩展中onClick函数没有执行它应该做的事情 js 文件 function hellYeah text doc
  • OData 中的过滤器和集合

    这与 Azure 最近推出的搜索服务有关 该服务目前处于预览状态 我试图弄清楚如何将 OData 的过滤器与集合一起使用 我知道我可以这样做 filter Products any p p eq WidgetA 它将按 WidgetA 过滤
  • Python-如何获取文本文件中的行数[重复]

    这个问题在这里已经有答案了 我想知道是否可以在不使用命令的情况下知道有多少行包含我的文件文本 with open test txt as f text f readlines size len text 我的文件非常大 所以很难使用这种方法
  • 使用 C# 添加附件到电子邮件

    我正在使用此答案中的以下代码通过 Gmail 在 NET 中发送电子邮件 https stackoverflow com questions 32260 sending email in net through gmail 我遇到的问题是在
  • 调整文本区域大小以适合所有内容[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • Google Play 中的生产版和测试版

    我已在 Google Play 中以生产模式发布了一个应用程序 现在 我有一个新版本 我想以 Beta 模式为有限数量的私人 Beta 用户发布 有可能两者兼得吗 即生产模式下的版本 1 0 和测试模式下的版本 1 1 或者我应该维护一个不
  • Node.js 中 For 循环中的 async.waterfall

    使用时async waterfall https github com caolan async在一个for循环 看来for循环在嵌套之前迭代async waterfall完成所有步骤 如何避免这种情况 for var i 0 i lt u
  • NSString sizeWithAttributes:内容矩形

    如何获得 NSString 的大小 就好像它在 NSRect 中绘制一样 问题是当我尝试 NSString sizeWithAttributes 时 它返回一个 NSSize 就好像它具有无限宽度一样 我想给该方法一个最大宽度 有什么办法可
  • 检测机器人帐户是否离线/在线

    我正在使用presenceUpdate然而 它触发了两次 我被告知它正在发出我与机器人拥有的共享服务器的数量 目前我的代码输出online两次 我不确定如何让它只输出一次 if newPresence userID botid if new
  • 处理外部函数导入

    这可能是一个关于如何处理外部函数的导入和导出函数的相当普遍的问题 所以我有一个component像这样 import React Component from react import handleChange from path impo
  • 将 args 和 kwargs 规范化为参数规范形式

    我正在寻找一种方法 给定函数的签名 将其 args 和 kwargs 规范化 也就是说 函数签名中传入的任何 kwargs 都应转换为 args 例如 def myfunc a b 0 c 0 kwargs pass def canonic
  • 当构造函数抛出异常并使用自定义 new 时,C++ 如何释放内存

    我看到以下结构 new X将释放内存 如果X构造函数抛出 operator new 可以超载 运算符 new 重载的规范定义是void operator new size t c heap h 以及相应的operator delete 最常
  • MDX 内的 Gatsby 静态图像(gatsby-plugin-image)

    最近我开始使用 Gatsby 现在我正在尝试使用 MDX 在我的 MDX 文件中 我可以通过 GraphQL 使用 Gatsby 图像 但我想使用 gatsby plugin image 中的静态图像 但出现错误像这样 react devt
  • 使用 Xlib 在 python 中获取窗口位置和大小

    我需要找到窗口的位置和大小 但我不知道如何找到 例如 如果我尝试 id get geometry id is Xlib display Window 我得到这样的东西 data height 2540 width 1440 depth 24
  • GraphQLError:必须提供查询根类型

    我使用 NestJS TypeORM 和 GraphQL 作为我的后端 API 我收到以下错误 GraphQLError Object Query root type must be provided at SchemaValidation
  • 取该组的每个第一个元素

    如何使用 EF 5 获取组中的每个第一个元素 var result await context SomeDbSet Where GroupBy x gt new x SomeField Select x gt x First ToListA
  • 将内容添加到pyqt4滚动区域

    如何将内容添加到 pyqt4 中的滚动区域 我要自定义一个小部件吗 例如 如果我有一个数组或一个列表a 10 2 2 2 22 3 3 3 我应该如何在可滚动区域中显示变量 如果要将内容添加到滚动区域 则需要定义一个新的小部件并将其添加到滚
  • 基于值的 R 颜色散点图点

    我能够绘制散点图并根据一个标准对点进行着色 即我可以将所有 gt 3 的点着色为红色 其余点着色为黑色 我希望能够以这种方式为点上色 3 color red 其余为黑色 下面的代码完成了步骤 1 和 3 但我不确定如何合并步骤 2 的第二个
  • 单元测试验证是否调用了伴生对象方法(模拟伴生对象)

    当切换到 Kotlin 时 静态方法被移至伴生对象中 但是 没有明显的方法来对调用这些 静态方法 的其他方法进行单元测试 在Java中 我们可以使用PowerMockito的MockStatic SomeClass class 来验证被测方