Mockito 验证抛出 UnfinishedVerificationException
Mockito verify throws UnfinishedVerificationException
在测试中,我使用了模拟对象:
@Mock
ListMultipleChoice<String> listMultipleChoiceMock;
我尝试验证其使用方法:
verify(listMultipleChoiceMock).setRequired(true);
verify(listMultipleChoiceMock).setMaxRows(2);
verify(listMultipleChoiceMock).setDefaultModel(any(IModel.class));
但它抛出以下异常:
org.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
这一行的异常点:
verify(listMultipleChoiceMock).setMaxRows(2);
setMaxRows 接受一个整数。
当我注释掉这一行时,测试成功。当我调试我的程序时,我可以看到设置了 setMaxRows 方法:
brandsListMultipleChoice.setMaxRows(brandLabels.size());
brandLabels 是一个列表,size() returns 是一个整数。
我检查了 brandLabels 的大小,它是 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());
}
}
正在测试的class:
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() {
}
});
}
}
当我注释掉第二个或第三个验证规则时,测试成功。
我尝试编写简单的测试:
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);
}
}
顺利通过。
您应该仔细检查您的 class 使用情况。
或者给更多的代码示例。
显然无法模拟 final 方法。
这个问题的解决方案是将模拟的 class 添加到注释 @PrepareForTest(ListMultipleChoice.class)
通过这种方式,PowerMockito 将处理模拟对象。
在测试中,我使用了模拟对象:
@Mock
ListMultipleChoice<String> listMultipleChoiceMock;
我尝试验证其使用方法:
verify(listMultipleChoiceMock).setRequired(true);
verify(listMultipleChoiceMock).setMaxRows(2);
verify(listMultipleChoiceMock).setDefaultModel(any(IModel.class));
但它抛出以下异常:
org.mockito.exceptions.misusing.UnfinishedVerificationException: Missing method call for verify(mock) here:
这一行的异常点:
verify(listMultipleChoiceMock).setMaxRows(2);
setMaxRows 接受一个整数。
当我注释掉这一行时,测试成功。当我调试我的程序时,我可以看到设置了 setMaxRows 方法:
brandsListMultipleChoice.setMaxRows(brandLabels.size());
brandLabels 是一个列表,size() returns 是一个整数。
我检查了 brandLabels 的大小,它是 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());
}
}
正在测试的class:
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() {
}
});
}
}
当我注释掉第二个或第三个验证规则时,测试成功。
我尝试编写简单的测试:
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);
}
}
顺利通过。 您应该仔细检查您的 class 使用情况。 或者给更多的代码示例。
显然无法模拟 final 方法。
这个问题的解决方案是将模拟的 class 添加到注释 @PrepareForTest(ListMultipleChoice.class)
通过这种方式,PowerMockito 将处理模拟对象。