用Java + Mockito嘲笑Kotlin方法

所以我将一个小的Java代码库迁移到Kotlin只是为了好玩,而且我已经迁移了这个Java类:

public class Inputs { private String engineURL; private Map<String, String> parameters; public Inputs(String engineURL, Map<String, String> parameters) { this.engineURL = engineURL; this.parameters = parameters; } public String getEngineURL() { return engineURL; } public String getParameter(String key) { return parameters.get(key); } } 

到这Kotlin表示:

 open class Inputs (val engineURL: String, private val parameters: Map<String, String>) { fun getParameter(key: String?): String { return parameters["$key"].orEmpty() } } 

但是现在我在使用Java编写的现有测试套件时遇到了一些麻烦。 更具体地说,我有这个使用Mockito的单元测试:

 @Before public void setupInputs() { inputs = mock(Inputs.class); when(inputs.getEngineURL()).thenReturn("http://example.com"); } 

并且在线路上失败了

 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. 

有谁知道我怎么能做这个工作? 我试过在Kotlin版本上创建一个实际的getter(而不是依靠隐式的getter),但是到目前为止还没有运气。

非常感谢!

(如果你问自己,为什么我要从产品代码开始而不是测试,或者为什么我不使用mockito-kotlin,这些问题没有真正的答案。就像我说的,我为了好玩而迁移向我的团队展示其他开发人员在实际项目中的语言之间的互操作性是多么容易)

更新 :我注意到,如果我添加when(inputs.getParameter("key")).thenReturn("value")相同的setupInputs()方法( inputs.getEngineURL() )调用之前),我结束了一个NullPointerException在Inputs#getParameter 。 WTF?

没关系,我通过重写Kotlin版本来解决这两个错误信息:

 open class TransformInputs (private val eURL: String, private val parameters: Map<String, String>) { open fun getParameter(key: String?): String { return parameters["$key"].orEmpty() } open fun getBookingEngineURL(): String { return eURL } }