Java 单元测试失败,出现org.mockito.exceptions.misusing.UnfinishedVerificationException
我在Mockito中创建了一些测试,用于验证其他演示者是否在主演示者初始化期间调用特定方法。其他演讲者都被嘲笑了 模拟演示者均实现以下界面:Java 单元测试失败,出现org.mockito.exceptions.misusing.UnfinishedVerificationException,java,unit-testing,mocking,mockito,testng,Java,Unit Testing,Mocking,Mockito,Testng,我在Mockito中创建了一些测试,用于验证其他演示者是否在主演示者初始化期间调用特定方法。其他演讲者都被嘲笑了 模拟演示者均实现以下界面: public interface PresenterHasParent<V, P extends Presenter> extends Presenter<V> { public abstract void setParentPresenter(P presenter); } 在我的家长演示者课程中,我有以下内容: pu
public interface PresenterHasParent<V, P extends Presenter> extends Presenter<V> {
public abstract void setParentPresenter(P presenter);
}
在我的家长演示者课程中,我有以下内容:
public class ParentPresenter() implements Presenter<ParentView>{
private ParentView view;
private ChildPresenterOne childPresenterOne;
private ChildPresenterTwo childPresenterTwo;
private ChildPresenterThree childPresenterThree;
private ChildPresenterFour childPresenterFour;
@Inject
public ParentPresenter(ParentView view, ChildPresenterOne childPresenterOne,
ChildPresenterTwo childPresenterTwo,
ChildPresenterThree childPresenterThree
ChildPresenterFour childPresenterFour) {
this.view = view;
this.childPresenterOne= childPresenterOne;
this.childPresenterTwo= childPresenterTwo;
this.childPresenterThree= childPresenterThree;
this.childPresenterFour= childPresenterFour;
}
//Other code
@Override
public void initPresenter() {
view.setPresenter(this);
childPresenterOne.initPresenter();
childPresenterTwo.initPresenter();
childPresenterThree.initPresenter();
childPresenterFour.initPresenter();
childPresenterOne.setParentPresenter(this);
childPresenterTwo.setParentPresenter(this);
childPresenterThree.setParentPresenter(this);
childPresenterFour.setParentPresenter(this);
registerHandlers();
}
}
公共类ParentPresenter()实现Presenter{
私有父视图;
私人儿童节目主持人;
private ChildPresenterwo ChildPresenterwo;
私人儿童演讲者三名儿童演讲者三名;
私人儿童演示者四名儿童演示者四名;
@注入
公共ParentPresenter(ParentView视图、ChildPresenterOne、ChildPresenterOne、,
ChildPresenter两个ChildPresenter两个,
儿童演讲者树儿童演讲者树
ChildPresenterFour ChildPresenterFour){
this.view=视图;
this.childPresenterOne=childPresenterOne;
this.childPresenterWO=childPresenterWO;
this.childPresenterTree=childPresenterTree;
this.childPresenterFour=childPresenterFour;
}
//其他代码
@凌驾
public void initPresenter(){
view.setPresenter(此);
childPresenterOne.initPresenter();
childPresenterTwo.initPresenter();
childPresenterTree.initPresenter();
childPresenterFour.initPresenter();
childPresenterOne.setParentPresenter(此);
childPresenterTwo.setParentPresenter(此);
ChildPresenterTree.setParentPresenter(此);
childPresenterFour.setParentPresenter(此);
寄存器句柄();
}
}
如您所见,我们使用注入来实现简单的单元测试。然后,我创建模拟实例,如下所示:
public class ParentPresenterTest {
private List<PresenterHasParent> presenters;
private ChildPresenterOne childPresenterOne;
private ChildPresenterTwo childPresenterTwo;
private ChildPresenterThree childPresenterThree;
private ChildPresenterFour childPresenterFour;
private ParentPresenter parentPresenter;
private View view;
@BeforeTest
public void setUp() {
presenters = new ArrayList<PresenterHasParent>();
view = mock(View.class);
childPresenterOne= mock(ChildPresenterOne.class);
presenters.add(childPresenterOne);
childPresenterTwo= mock(ChildPresenterTwo.class);
presenters.add(childPresenterTwo);
childPresenterThree= mock(ChildPresenterThree.class);
presenters.add(childPresenterThree);
childPresenterFour= mock(ChildPresenterFour.class);
presenters.add(childPresenterFour);
parentPresenter = new ParentPresenter(view, childPresenterOne, childPresenterTwo, childPresenterThree, childPresenterFour);
}
@Test
public void testInitPresenter() {
parentPresenter.initPresenter();
verify(view).setPresenter(parentPresenter);
for(PresenterHasParent presenterToCheck : presenters) {
Reporter.log("Testing the presenter " + presenterToCheck.getClass().getName(), true);
verify(presenterToCheck).initPresenter();
verify(presenterToCheck).setParentPresenter(parentPresenter);
validateMockitoUsage();
Reporter.log("Successfully tested the presenter " + presenterToCheck.getClass().getName(), true);
}
}
}
公共类ParentPresenterTest{
私人名单主持人;
私人儿童节目主持人;
private ChildPresenterwo ChildPresenterwo;
私人儿童演讲者三名儿童演讲者三名;
私人儿童演示者四名儿童演示者四名;
私人家长演示者家长演示者;
私人视野;
@试验前
公共作废设置(){
presenters=新的ArrayList();
view=mock(view.class);
childPresenterOne=mock(childPresenterOne.class);
添加(childPresenterOne);
ChildPresenterWO=mock(childPresenterWO.class);
添加(childPresenterWO);
ChildPresenterTree=mock(childPresenterTree.class);
添加(ChildPresenterTree);
childPresenterFour=mock(childPresenterFour.class);
添加(childPresenterFour);
parentPresenter=新的parentPresenter(视图、childPresenterOne、ChildPresenterWO、ChildPresenterTree、childPresenterFour);
}
@试验
公共无效testInitPresenter(){
parentPresenter.initPresenter();
验证(查看).setPresenter(parentPresenter);
对于(演示者备用演示者检查:演示者){
log(“测试演示者”+presenterToCheck.getClass().getName(),true);
验证(presenterToCheck).initPresenter();
验证(presenterToCheck).setParentPresenter(parentPresenter);
validateMockitoUsage();
log(“成功测试了演示者”+presenterToCheck.getClass().getName(),true);
}
}
}
在运行这些测试时,我在第三或第四个演示者(取决于我所做的)上遇到一个失败,即:
org.mockito.exceptions.misusing.UnfinishedVerificationException:
此处缺少验证(模拟)的方法调用:
->在ParentPresenterTest.TestInItemPresenter上(ParentPresenterTest.java:118)
正确验证示例:
验证(模拟).doSomething()
此外,出现此错误可能是因为您验证了以下任一项:
final/private/equals()/hashCode()方法。这些方法是不可能的
存根/核实
在
ParentPresenterTest.testInitPresenter(ParentPresenterTest.java:119)
现在,如果它一直失败,我可以理解,但如果我在每个方法中设置断点并逐步执行,它就可以正常工作。如果我没有设置断点,它总是失败并抱怨第三个presenter上的行(118):verify(presenterToCheck)。setParentPresenter(presenter)代码>
我不明白它为什么会失败,特别是因为如果我调试并逐步跳过代码,它确实可以工作。有人能解释一下这个令人困惑的问题吗
编辑
因此,如果我跳过第三个演示者验证检查,然后再次运行代码,它将在第四个出现相同问题时失败。但是如果我也跳过第四个的代码,它就可以正常工作了。这里发生了一些非常奇怪的事情,因为我无法调试以发现问题,这让生活变得非常困难 经过一番调查,我发现了这个问题。由于我创建一些超级抽象类的方式(在创建新接口之前),我让Mockito感到困惑。这是一个有点糟糕的设计,但莫基托的行为也很奇怪
我正在检查的方法:
verify(presenterToCheck).setParentPresenter(parentPresenter);
是界面presenterSharet
中的抽象方法。但是,测试失败的对象还实现了一个BaseEditPresenter
。此BaseEditPresenter
没有实现接口PresenterSharent
,但有自己的方法版本setParentPresenter()
。这导致了Mockito的混淆,因为它不知道真正调用了什么方法(尽管它们做了相同的事情)。奇怪的是,它确实可以在单步执行时工作,但在直接运行代码时却从未工作过
因此,为了修复它,我必须清理设计并确保BaseEditPresenter
实现了PresenterSharet
接口,而不是
verify(presenterToCheck).setParentPresenter(parentPresenter);