当前位置: 首页 > 知识库问答 >
问题:

Mockito验证抛出未完成验证异常

高恺
2023-03-14

在测试中,我使用的是mockobject:

@Mock
ListMultipleChoice<String> listMultipleChoiceMock;

我试图验证其方法的使用:

verify(listMultipleChoiceMock).setRequired(true);
verify(listMultipleChoiceMock).setMaxRows(2);
verify(listMultipleChoiceMock).setDefaultModel(any(IModel.class));

但它抛出以下异常:

组织。莫基托。例外情况。滥用。UnfinishedVerificationException:此处缺少验证(模拟)的方法调用:

这一行的例外点是:

verify(listMultipleChoiceMock).setMaxRows(2);

setMaxRows接受一个int。

当我注释掉这一行时,测试成功了。调试程序时,我可以看到正在设置的setMaxRows方法:

brandsListMultipleChoice.setMaxRows(brandLabels.size());

BrandLabels是一个List,size()返回一个int。

我检查了品牌标签的大小,它是2。我也尝试过anyInt()和0,它们都会导致抛出异常。

我做错了什么?为什么这种验证没有成功?

下面是我的代码示例,它将失败:

import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.whenNew;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Example.class})
public class ExampleTest {

    @Mock
    ListMultipleChoice<String> brandsListMultipleChoiceMock;

    @Before
    public void setUp() throws Exception {
        whenNew(ListMultipleChoice.class).withAnyArguments().thenReturn(brandsListMultipleChoiceMock);

        Example example = new Example();
    }

    @Test
    public void test() throws Exception {
        verify(brandsListMultipleChoiceMock).setRequired(true);
        verify(brandsListMultipleChoiceMock).setMaxRows(1);
        verify(brandsListMultipleChoiceMock).setDefaultModel(anyObject());

    }
}

以及正在测试的类别:

import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Example {

    private ListMultipleChoice<String> brandsListMultipleChoice;

    public Example() {

        List<String> brandLabels = new ArrayList<>();
        brandLabels.add("DEMO");

        brandsListMultipleChoice = new ListMultipleChoice<>("brands", new PropertyModel<Set<String>>(this, "brandProperty"), brandLabels);
        brandsListMultipleChoice.setRequired(true);
        brandsListMultipleChoice.setMaxRows(brandLabels.size());
        brandsListMultipleChoice.setDefaultModel(new IModel<Set<String>>() {
            private Set<String> list = new HashSet<>();

            @Override
            public Set<String> getObject() {
                return list;
            }

            @Override
            public void setObject(Set<String> ts) {
                list = ts;
            }

            @Override
            public void detach() {
            }
        });
    }
}

当我注释掉第二个或第三个验证规则时,测试成功。

共有2个答案

石博艺
2023-03-14

显然不可能嘲笑最终的方法。

将@PrepareTolution添加到该类的问题是

这样,PowerMockito将处理被模拟的对象。

拓拔嘉运
2023-03-14

我尝试编写简单的测试:

public class ListMultipleChoiceTest {
    public class ListMultipleChoice<T>{
        public void setMaxRows(int maxRows) {
        }
    }

    @Mock
    ListMultipleChoice<String> listMultipleChoiceMock;

    @Test
    public void testSetMaxRows() {
        verify(listMultipleChoiceMock, never()).setMaxRows(2);
        listMultipleChoiceMock.setMaxRows(2);
        verify(listMultipleChoiceMock).setMaxRows(2);
    }
}

它成功通过了。你应该仔细检查你的类使用情况。或者给出更多的代码示例。

 类似资料:
  • 如何验证一个模拟对象根本没有被调用?我正在尝试使用Mockito测试一个接口方法的空实现。

  • 我的验证器类 当我没有选择任何选项就提交表单时, 无法将类型java.lang.String的属性值转换为属性类别所需的类型com.main.java.category;嵌套异常为java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性类别所需的类型[com.main.java.category]:找不到匹配的编辑器或转换策略 这

  • 我正在测试带注释的javax验证。它们在应用程序中工作良好,方法参数上有注释。但是当我试图通过手动构建验证工厂来测试它们时 我得到以下错误。 javax。验证。ValidationException:HV000183:无法初始化“javax”。艾尔。“表达工厂”。检查类路径上是否有EL依赖项,或者改用ParameterMessageInterpolator 收到这个错误后,我在gradle文件中添

  • 我读过很多关于这方面的帖子,但我无法解决我的问题。当我试图验证zend表单验证码时,即使文本正确,也总是失败。下面是我的代码: 谢谢你的时间和帮助!! 我看到了一些不可靠的东西:当我在联系人操作中转储$_post时,我的结果是: 我刚刚输入的验证码甚至出现了,取而代之的是验证码凯!!?? 我觉得我需要删除这个captchaField,但不知道如何到目前为止! 我可以用JS做到这一点,但必须有一个干

  • 当我使用ValidationUtil.InvokeValidator验证时 2018-07-06 16:04:09.769错误10223--[nio-8080-exec-1]O.a.C.C.C.[.[.[/].[dispatcherServlet]:路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;嵌套异常为java

  • 我正在测试一个具有预期异常的方法。我还需要验证在抛出异常后是否调用了一些清理代码(在模拟对象上),但看起来该验证被忽略了。这是代码。我正在使用 Junit 来验证预期的异常。 似乎完全被忽略了。无论我在中使用什么方法,我的测试都通过了,这不是我想要的。 你知道为什么会发生这种情况吗?