从强制转换操作返回模拟,Mockito,Java
我在这里尝试测试以下代码:从强制转换操作返回模拟,Mockito,Java,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我在这里尝试测试以下代码: public class Something { public String doSomething(MyClass myClass) { return Utils.getPresentationString(myClass) } } public class Utils{ public static String getPresentationString(MyClass myClass) { if (my
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>>
doReturn(this.mySubClassMock).when(this.myClassMock)。
该行是一个强制转换,它无法返回尚未返回的内容。但是后来
public static String getPresentationString(MyClass myClass) {
if (myClass instanceof MySubClass) {
这就是进入该类的对象
因此,您只需要:
MySubClass subclassMock = mock(MySubClass.class);
...
objectUnderTest.getPresentationString(subclassMock);
然后,您的生产代码应该很高兴地转到“ItisaInstanceof”,然后进行强制转换,让您完全控制传入对象
但请注意:这里的“真正”OOP方式是:避免instanceof/cast
return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()
为什么子类不重写getPresentationString()
,以返回其他值?如果这是错误的,那么有可能有一个“基本”抽象方法,然后有两个实现吗
长话短说:
- 直接的答案是:只需传入
或mock(MyClass.class)
,这取决于您要测试的路径mock(MySubClass.class)
- 但更好的办法是:完全去掉那个实例/铸件。好的OOP的全部要点就是要避免这样的代码李>
public static String getPresentationString(MyClass myClass) {
if (myClass instanceof MySubClass) {
这就是进入该类的对象
因此,您只需要:
MySubClass subclassMock = mock(MySubClass.class);
...
objectUnderTest.getPresentationString(subclassMock);
然后,您的生产代码应该很高兴地转到“ItisaInstanceof”,然后进行强制转换,让您完全控制传入对象
但请注意:这里的“真正”OOP方式是:避免instanceof/cast
return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()
为什么子类不重写getPresentationString()
,以返回其他值?如果这是错误的,那么有可能有一个“基本”抽象方法,然后有两个实现吗
长话短说:
- 直接的答案是:只需传入
或mock(MyClass.class)
,这取决于您要测试的路径mock(MySubClass.class)
- 但更好的办法是:完全去掉那个实例/铸件。好的OOP的全部要点就是要避免这样的代码李>
- 强制转换是一种编译时检查,在运行时并不重要
只需传递已配置了正确存根的
的模拟实例 强制转换是一种编译时检查,在运行时并不重要MySubClass
只需传递已配置了正确存根的
的模拟实例 你是对的,从来没有意识到我可以直接使用mySubClassMock,你对cast和instanceof也是对的,但是因为这已经在生产中,我的任务是对它进行单元测试,除非我进行代码审查和审计。@Sebastien你就是你决定要做的。把你自己看作欧米加部门,最后一道防线()。你是看门人,是奖励勤奋工人的人,也是撕裂懒惰工人的人。或者诸如此类。你是对的,从来没有意识到我可以直接使用mySubClassMock,你对cast和instanceof也是对的,但是因为这已经在生产中,我的任务是对它进行单元测试,除非我经过代码审查和审计,否则我不能更改它。@Sebastien你就是你决定要做的人。把你自己看作欧米加部门,最后一道防线()。你是看门人,是奖励勤奋工人的人,也是撕裂懒惰工人的人。或者类似的东西。为什么不首先覆盖MySubClass
?为什么不首先覆盖getPresentationString()
?getPresentationString()