Mockito -使用内部循环中的函数测试嵌套循环

k4ymrczo  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(195)

我是单元测试的初学者。我使用JUnit和Mockito。这是我想测试的一个示例方法。

public Void getPeopleNumbersList(List<Aggregate<Person>> aggregateList) {
    for (List<Person> person : peopleList) {
        List<PhoneNumber> phoneNumbersList = getPhoneNumbers(person);
        for (PhoneNumber phoneNumber : phoneNumbersList) {
            //Some functions to do some DB operations. 
            DynamoDB.update(phoneNumber); // Just an example

        }
    }

}

如何测试Mockito中每个人的每个电话号码是否调用了操作/功能(这里是更新调用)?

fkvaft9z

fkvaft9z1#

这取决于你的方法应该做什么。你提供的例子很难测试,因为你调用的是一个静态类。我假设你可以在你的测试类中获得对DB操作的引用。如果是这样,我会用mockito模拟你的数据库引用:

@InjectMocks
private YourClassToTest classUnderTest; // the class where the 

@Mock
private Database database;  

void someTest(){
  List<Aggregate<Person>> aggregateList = new ArrayList<>();

  classUnderTest.getPeopleNumbersList();

  verify(database, times(0)).update(any());
}
fnx2tebb

fnx2tebb2#

为了进入for循环,你应该发送一个实际的列表。假设你测试的类是ClassUnderTest。一旦你进入for循环,如果你能继续正常执行getPhoneNumbers(),那么它就很好了,否则就模仿它。

@Test
public void test()
{
 List<Aggregate<Person>> list = new ArrayList<>();
 list.add(value1);
 list.add(valuen);
 List<PhoneNumber> list_phone = new ArrayList<>();
 list_phone.add(value1);
 list_phone.add(valuen);
 ClassUnderTest object = new ClassUnderTest();
 ClassUnderTest spy = spy(object);
 when(spy.getPhoneNumbers(person)).thenReturn(list_phone);
 // .....
 // mock the operations inside 
 // the method DynamoDB.update(phoneNumber);
 // .....
 object.getPeopleNumbersList(list);
 }

相关问题