0

所以我将一个小型 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");
}

它失败了when,说

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()) 调用之前),我最终会在Inputs#getParameter. 怎么回事?!

4

1 回答 1

1

没关系,我通过像这样重写 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
    }

}
于 2017-07-03T01:39:19.487 回答