Java Mockito:无法返回 child 类?
Java Mockito: Cannot doReturn child classes?
当我尝试模拟一个方法时,我得到了一个 UnfinishedStubbingException
。我正在尝试让 doReturn
return 成为实现特定接口的 class 的模拟实例。该接口是被模拟方法的原始 return 类型。
这里有一个 class 结构的例子:
class A {
private C obj;
C getObj() {
return obj;
}
}
class B implements C {
void doCStuff() {}
void doBStuff() {}
}
interface C {
void doCStuff();
}
使用此结构,我试图 mock A.getObj()
并使其 return 成为 B
的模拟实例。
public void test() {
A aObj = Mockito.mock(A.class);
B bObj = Mockito.mock(B.class);
Mockito.doReturn(bObj).when(aObj).getObj(); //throws UnfinishedStubbingException
//Edit:
B newB = (B)aObj.getObj();
newB.doBStuff();
}
问题是,我需要使 getObj
return 成为 B
的模拟实例,但我做不到。通常在 Java 中,我可以从具有 return 类型 C
的方法中多态 return B
的实例,因为 B
实现C
。但是,似乎 doReturn
不能 return 实现原始 return 类型的 child class 实例。
我希望我的理解是正确的,但是我做错了什么或者有解决办法吗?
不确定这是否有效;缺少代码来判断这是否可以解决问题,但也许您可以试试这个:
final C c = spy(new B());
final A a = spy(new A());
doReturn(c).when(a).getObj();
更完整的答案需要更完整的问题 ;)
啊,我是个白痴。原来我试图模拟的方法是最终的,我最初没有注意到。它来自超级 class,我认为它不是最终版本。 final 方法不能被覆盖,Mockito 不能模拟它们。
这是一个更好的例子:
class A extends D {
...
}
class D {
//Can't mock this.
final Object getObj() { ... }
}
事实证明,您仍然可以通过 Mockito 多态 return 对象,所以虚惊一场。
当我尝试模拟一个方法时,我得到了一个 UnfinishedStubbingException
。我正在尝试让 doReturn
return 成为实现特定接口的 class 的模拟实例。该接口是被模拟方法的原始 return 类型。
这里有一个 class 结构的例子:
class A {
private C obj;
C getObj() {
return obj;
}
}
class B implements C {
void doCStuff() {}
void doBStuff() {}
}
interface C {
void doCStuff();
}
使用此结构,我试图 mock A.getObj()
并使其 return 成为 B
的模拟实例。
public void test() {
A aObj = Mockito.mock(A.class);
B bObj = Mockito.mock(B.class);
Mockito.doReturn(bObj).when(aObj).getObj(); //throws UnfinishedStubbingException
//Edit:
B newB = (B)aObj.getObj();
newB.doBStuff();
}
问题是,我需要使 getObj
return 成为 B
的模拟实例,但我做不到。通常在 Java 中,我可以从具有 return 类型 C
的方法中多态 return B
的实例,因为 B
实现C
。但是,似乎 doReturn
不能 return 实现原始 return 类型的 child class 实例。
我希望我的理解是正确的,但是我做错了什么或者有解决办法吗?
不确定这是否有效;缺少代码来判断这是否可以解决问题,但也许您可以试试这个:
final C c = spy(new B());
final A a = spy(new A());
doReturn(c).when(a).getObj();
更完整的答案需要更完整的问题 ;)
啊,我是个白痴。原来我试图模拟的方法是最终的,我最初没有注意到。它来自超级 class,我认为它不是最终版本。 final 方法不能被覆盖,Mockito 不能模拟它们。
这是一个更好的例子:
class A extends D {
...
}
class D {
//Can't mock this.
final Object getObj() { ... }
}
事实证明,您仍然可以通过 Mockito 多态 return 对象,所以虚惊一场。