gpt4 book ai didi

java - 使用 mockito 进行单元测试时抛出 WrongTypeOfReturnValue 异常

转载 作者:行者123 更新时间:2023-11-29 05:26:08 25 4
gpt4 key购买 nike

我的测试

List<Person> myList;

@Test
public void testIsValidPerson() {
myList = new ArrayList<Person>();

myList.add(new Person("Tom"));
when(personDao.get(person)).thenReturn(myList);
when((personDao.get(person)).isEmpty()).thenReturn(false);//------Exception thrown

boolean result = service.isValid("Tom");
assertFalse(result);
}

待测方法:

public boolean isValid(String person){
personDao = new PersonDao();
Person personObj = new Person(person);
return (personDao.get(person).isEmpty())?false : true;
}

抛出异常:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by get()
get() should return List
***
If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. This exception *might* occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.
2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies -
- with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.

我使用 spy 的第二种方法:

public void testIsValidPerson() {
myList = new ArrayList<Person>();

myList.add(new Person("Tom"));
when(personDao.get(person)).thenReturn(myList);

List<Person> mylist = personDao.get(person);
List spy = spy(mylist);

doReturn(false).when(spy.isEmpty());//------exception thrown

boolean result = service.isValid("Tom");
assertFalse(result);
}

这给了我以下异常:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.PersonTest.testIsValid(PersonTest.java:76)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!

第三种方法:

@Test
public void testIsValidPerson() {
myList = new ArrayList<Person>();

myList.add(new Person("Tom"));
when(personDao.get(person)).thenReturn(myList);

boolean result = service.isValid("Tom");//--------Throws null pointer exception
assertFalse(result);
}

public boolean isValid(String person){
personDao = new PersonDao();
Person personObj = new Person(person);
return (personDao.get(person).isEmpty())?false : true; //----throws NPE
}

第四种方法:抛出空指针异常

@Test
public void testIsValidPerson() {
List<Person> mockedList = mock(List.class);
when(personDao.get(person)).thenReturn(mockedList);
when(personDao.get(person)).isEmpty().thenReturn(false);
boolean result = service.isValid("Tom");//--------Throws null pointer exception
assertFalse(result);
}

public boolean isValid(String person){
personDao = new PersonDao();
Person personObj = new Person(person);
return (personDao.get(person).isEmpty())?false : true; //----throws NPE
}

第五种方法:同样给出 NPE。

personDao 的get 方法访问数据库,在获取到数据库的连接时抛出NPE。但是当我得到一个空列表时,它并没有第一次给出 NPE。我在 service.isValid()

的第二次调用中收到 NPE
@Test
public void testIsValidPerson() {
when(personDao.get(person)).thenReturn(new ArrayList<Person>());
List tempList=personDao.get(person);//----I get empty tempList---No NPE
boolean result = service.isValid("Tom");//--------Throws null pointer exception
assertFalse(result);
}

方法 6:

@Test
public void testIsValid() {
personList = new ArrayList<Person>();
Person person = new Person("Tom");
personList.add(person);
when(personDao.get(person)).thenReturn(personList);//-------Uses same person object

boolean result = service.isValid(person);//------------Uses same person object
assertTrue(result);
}

然后我更改了我的方法签名(这样测试和被测方法将使用相同的值)。

public boolean isValid(String name)

public boolean isValid(Person person)

最佳答案

基本上你没有足够的模拟。您正在尝试模拟由模拟对象返回的 ListisEmpty 方法。你有一个模拟对象,但你没有让模拟对象返回一个模拟列表,所以你可以模拟一个模拟列表的方法......

但我无法理解的一件事是,为什么您要尝试创建一个包含元素的列表,但对 isEmpty 返回 true

如果您需要测试代码在获得空列表时的行为,只需创建一个空列表即可。这样 isEmpty 将自动返回 false。

when(personDao.get(person)).thenReturn(new ArrayList<Person>());

关于java - 使用 mockito 进行单元测试时抛出 WrongTypeOfReturnValue 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com