首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么没有将$MockitoMock$实例标识为模拟?

为什么没有将$MockitoMock$实例标识为模拟?
EN

Stack Overflow用户
提问于 2018-01-08 16:46:34
回答 1查看 134关注 0票数 0

我使用Kotlin、Mockito和MockitoJRunner运行以下简化测试:

代码语言:javascript
复制
open class SomeClassToBeMocked @Inject constructor() {
    fun map(foo: Foo): Bar {...}
}

@Mock
private lateinit var someMock: SomeClassToBeMocked
@InjectMocks
private lateinit var subject: Subject

@Test
fun shouldAssertSomething() {
    val foo = Foo() // from Foo.kt
    val bar = Bar() // from Bar.java from *another module*
    whenever(someMock.map(foo)).thenReturn(bar) // breakpoint[1]

    subject.myMethod(foo)

    verify(someMock).map(foo)
}

此模式适用于代码的其他部分,但不适用于这个特定的测试,在该测试中,我得到以下错误消息:

代码语言:javascript
复制
org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
   Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.

breakpoint[1]调试代码时,我可以看到someMock是类SomeClassToBeMocked$MockitoMock$的一个实例。此外,如果我试图在someMock.map(foo)之前立即调用breakpoint[1],它确实会运行原始方法,而不是像所有模拟一样返回null

对这里会发生什么有什么想法吗?

更新-1:我检查了错误消息中选项1的所有可能性。我也尝试过mock(SomeClassToBeMocked::class.java)并获得了相同的错误消息。这种情况一直发生在一些最简单的类中,只有一个公共方法只将对象A转换为对象B。

更新-2:如果有任何不同,我只是注意到在发生这种情况的情况下,Bar()生活在与测试不同的模块中。我更新了代码以反映这一点。

UPDATE-3:如果我创建一个名为SomeClassToBeMocked的接口并将原始类重命名为SomeClassToBeMockedImpl,那么一切都很有魅力。但是,我仍然想弄清楚为什么会发生这种情况,以及如何避免为此创建一个接口。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-08 21:09:18

为了用Mockito模拟函数的返回值,需要用open关键字标记它:

代码语言:javascript
复制
open class SomeClassToBeMocked @Inject constructor() {
    open fun map(foo: Foo): Bar {...}
}

问题是,Mockito不能模拟final (不能被覆盖)函数。与Java不同,Kotlin需要对可重写的成员进行显式注释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48154580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档