gpt4 book ai didi

java - 从类型转换操作返回模拟,Mockito,Java

转载 作者:行者123 更新时间:2023-11-29 07:24:18 27 4
gpt4 key购买 nike

我这里有这段代码,我正在尝试测试:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com