Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试失败,出现org.mockito.exceptions.misusing.UnfinishedVerificationException_Java_Unit Testing_Mocking_Mockito_Testng - Fatal编程技术网

Java 单元测试失败,出现org.mockito.exceptions.misusing.UnfinishedVerificationException

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

我在Mockito中创建了一些测试,用于验证其他演示者是否在主演示者初始化期间调用特定方法。其他演讲者都被嘲笑了

模拟演示者均实现以下界面:

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);