【问题标题】:How to use mockk with a generic constructor param?如何将 mockk 与通用构造函数参数一起使用?
【发布时间】:2021-07-22 16:14:05
【问题描述】:

所以我有课

class Test<T : SomeListener> @Inject constructor(
     private val dependency1: Dependency1,
     private val listener: T
)

我正在尝试使用 mockk 为其编写单元测试,并在尝试使用泛型类型对其进行模拟和初始化时遇到错误。

class TestTest {
     @MockK
     lateinit var dependency1: Dependency1
     @MockK
     lateinit var listener: ListenerImpl

     @InjectMockKs(overrideValues = true)
     lateinit var testObject: Test<ListenerImpl>
}

我不断收到错误“io.mockk.MockKException: No matching constructors found: ... listener : T =

使用这个通用参数值正确模拟构造函数的正确方法是什么?

【问题讨论】:

  • 我猜是因为类型擦除,在字节码构造函数中会有签名&lt;init&gt;(Dependency1, SomeListener)。而 mockk 试图找到 &lt;init&gt;(Dependency1, ListenerImpl) 并失败了。你应该使用lateinit var testObject: Test&lt; SomeListener&gt;
  • 感谢您的评论。不幸的是同样的错误。它似乎并不关心在模拟中分配的泛型。它总是只引用'listener T'

标签: android android-testing mockk


【解决方案1】:

不幸的是,我无法找到一种纯粹使用注释的方法。我最终做的是:

class TestTest {
     @MockK
     lateinit var dependency1: Dependency1
     @MockK
     lateinit var listener: ListenerImpl

   
     lateinit var testObject: Test<SomeListener>

     @BeforeEach
     fun setUp() {
         testObject = Test(
              dependency1,
              listener
          )
     }
}

这有效并正确初始化了 testObject。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多