使用Mockito和反射调用私有函数

5m1hhzi4  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(295)

bounty将在5小时后到期。回答此问题可获得+100声望奖励。lostintranslation希望引起更多关注这个问题。

我正在尝试用mockk模拟Kotlin中的私有函数调用。运行时遇到以下错误:
班级是最终的。将@MockKJUnit4Runner放在您的测试中,或添加MockK Java Agent instrumentation以使所有类“打开”
我完全理解尝试测试私有方法的含义,但在这一点上,这是我需要做的。
验证码:

class ClassToTest {
  private fun privateMethod(text: String): String {
    return "Hello $text"
  }
}

class TestClass {

   @Before
   fun setup() {
      MockitoAnnotations.openMocks(this)
   }

   @Test
   fun testSplitNumbers() {
      val clazz = spyk<ClassToTest>()

      val method = clazz.javaClass.getDeclaredMethod("privateMethod", String::class.java)
      method.isAccessible = true
      val result = method.invoke(clazz, "Test") as? String
      Assert.assertEquals("Hello Test", result)
   }
}
eqqqjvef

eqqqjvef1#

正如文档中所概述的,MockK支持监视和模拟私有函数。
一定要理解类的the implications of testing private methods
假设您使用了一个无法控制的第三方库,它提供了一个方法publicMethod,该方法反过来调用一个私有方法privateMethod,您希望模拟后者以简化测试。

class Foo {
  fun publicMethod(): String = "Hello ${privateMethod()}!"

  private fun privateMethod(): String = "World"
}

您可以使用以下内容模拟privateMethod

fun `mock private function`() {
  val mock = spyk<Foo>(recordPrivateCalls = true)

  every { mock["privateMethod"]() } returns "Test"

  assertEquals("Hello Test!", mock.publicMethod())
}
t9aqgxwy

t9aqgxwy2#

你可以试试这个…

when(spy, method(CodeWithPrivateMethod.class, "privateMethod", String.class, int.class)) 
.withArguments(anyString(), anyInt()) 
.thenReturn(true);

doReturn(true).when(codeWithPrivateMethod, "privateMethod", anyString(), anyInt());

With no argument:

ourObject = PowerMockito.spy(new OurClass());
when(ourObject , "ourPrivateMethodName").thenReturn("mocked result");

With String argument:

ourObject = PowerMockito.spy(new OurClass());
when(ourObject, method(OurClass.class, "ourPrivateMethodName", String.class))
                .withArguments(anyString()).thenReturn("mocked result");

相关问题