我这里有这段代码,我正在尝试测试:
public class Something {
public String doSomething(MyClass myClass) {
return Utils.getPresentationString(myClass)
}
}
public class Utils{
public static String getPresentationString(MyClass myClass) {
if (myClass instanceof MySubClass) {
MySubClass mySubClass = (MySubClass) myClass;
return mySubClass.getMaskedPresentationString();
} else {
return myClass.getPresentationString();
}
}
}
因为 Utils 是静态的,所以我在测试 Something 类时以黑盒方式对其进行测试。
我试图让这行代码返回一个模拟:
MySubClass mySubClass = (MySubClass) myClass;
我能做到
doReturn(MY_MASKED_STRING).when(this.mySubClassMock).getMaskedPresentationString()
然后做
assertEquals(MY_MASKED_STRING, this.somethingUnderTest.doSomething(this.myClassMock))
我该如何做这样的工作
doReturn(this.mySubClassMock).when(this.myClassMock).<<cast to MySubClass.class>>
最佳答案
该行是强制转换,它无法返回不存在的内容。但是然后。
public static String getPresentationString(MyClass myClass) {
if (myClass instanceof MySubClass) {
那只是进入该类的对象。
因此你只需要:
MySubClass subclassMock = mock(MySubClass.class);
...
objectUnderTest.getPresentationString(subclassMock);
然后您的生产代码应该很高兴地“它是一个 instanceof”,然后进行转换,让您完全控制传入的对象。
但请注意:此处“真正的”OOP 方式:避免使用 instanceof/cast!
return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()
为什么您的子类不覆盖 getPresentationString()
以返回其他值?如果那是错误的,是否有可能有一些“基本”抽象方法然后有两个实现?!
长话短说:
- 直接的答案是:只需传入
mock(MyClass.class)
或mock(MySubClass.class)
的内容,具体取决于您打算使用的路径测试 - 但更好:完全摆脱 instanceof/cast 部分。好的 OOP 的全部要点就是完全避免这样的代码!
关于java - 从类型转换操作返回模拟,Mockito,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57296914/