我正在进行一个混合的JVM项目:类主要使用Java,测试主要使用Kotlin.

所以我有一个Java MyClass,它扩展了ParentClass.两个航班都是雅加达@Entity航班.它们是分开的,因为ParentClass可以在其他地方使用:

@Entity
@Setter
@Getter
public class MyClass extends ParentClass {
  // some attributes
}

ParentClass的属性只有getter,没有setters(由于对象已创建,因此必须不修改这些值):

@MappedSuperclass
@Getter
public class ParentClass {
  private String value = "";
}

现在,我正在测试代码的某些部分,并try 模拟此对象以将值更新为非空值.

因为没有setters,所以我们的 idea 是创建模拟,以便能够修改getValue()并返回避免反射的其他值.

我试着用了mock.when(myMock.getValue()).thenReturn("my string")左右的东西,但它不起作用.

在考特林测试中,我try 了多条线路:

val myMock = mock<MyClass>(CALLS_REAL_METHODS)

`when`(myMock.value).thenReturn("")
// or using mockito kotlin
whenever(myMock.value).thenReturn("")

第一行试图强制调用真正的getter,然后在接下来的两行中模拟一些getter,并通过这种方式获得所需的值.

但似乎不是工作是这样的.

我也试过this answer次了

val myMock = mock<MyClass>()
// And also
val myMock = org.mockito.kotlin.mock<MyClass>()

// And these two
`when`(myMock.value).thenReturn("")
whenever(myMock.value).thenReturn("")

它们都不起作用,我仍然有为moockito创建的"空"对象,所有值都是空的/对象是默认的.

还try 了:

val mock1: MyClass = mock(MyClass::class.java)
`when`(mock1.value).thenReturn("")
whenever(mock1.value).thenReturn("")

val mock2: MyClass = mock();
`when`(mock2.value).thenReturn("")
whenever(mock2.value).thenReturn("")

val mock3: MyClass = mock(CALLS_REAL_METHODS)
`when`(mock3.value).thenReturn("")
whenever(mock3.value).thenReturn("")

它们都不起作用,我的模拟类有缺省值.但不是其他的问题,但我也想修改父类,这是没有被嘲笑的.

那么,我错过了什么?使用Java和Kotlin是否存在互操作问题?是@Entity@MappedSuperclass个奇怪的东西吗?

我需要使用反射吗?

提前谢谢你,

推荐答案

你需要创造一个间谍,而不是一个嘲弄.

val mySpy = spy(MyClass())
println(mySpy.value)  // original value
`when`(mySpy.value).thenReturn("stubbedValue")
println(mySpy.value)  // stubbed value

Java相关问答推荐

将偶数元素移动到数组的前面,同时保持相对顺序

如果给定层次 struct 级别,如何从其预序穿越构造n元树

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

CAMEL 4中的SAXParseException

如何获得执行人?

如何在ApachePOI中将图像添加到工作表的页眉?

Java:使用Class.cast()将对象转换为原始数组

Log4j与jdk21兼容吗?

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

如何在代码中将行呈现在矩形前面?

将JSON字符串转换为Java类

在处理2个映射表时,没有更多的数据可从套接字读取

如何创建模块信息类文件并将其添加到JAR中?

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

在Java中比较同一多维数组的两个不同的字符串元素

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

java中的网上购物车解析错误

从 Java 17 切换回 Java 8 后出现的问题