gpt4 book ai didi

java - Mockito 中的连续通话测试

转载 作者:行者123 更新时间:2023-12-01 07:28:44 25 4
gpt4 key购买 nike

我有简单的服务

package net.betlista;

import java.util.List;

public class MyServiceImpl implements MyService {

MyDao dao;

public void saveAll(final List<Integer> list) {
for (final int i : list) {
dao.save(i);
}
}

void setDao(final MyDao dao) {
this.dao = dao;
}

}

和 DAO

package net.betlista;

public class MyDaoImpl implements MyDao {

public void save(final Integer i) {
// do nothing, ok for tests
}

}

我想用 Mockito 测试一下,当我调用 service.saveAll() 时,会为列表中的所有实例调用 save() 调用:

package net.betlista;

import java.util.LinkedList;
import java.util.List;

import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mockito;

public class MyServiceTest {

@Test
public void test() {
final MyDao daoMock = Mockito.mock(MyDao.class);
final MyServiceImpl service = new MyServiceImpl();
service.setDao(daoMock);

final List<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);

service.saveAll(list);

// not working, it's ok, should fail
// Mockito.verify(daoMock).save(Matchers.eq(1));
// Mockito.verify(daoMock).save(Matchers.eq(1));

final InOrder inOrder = Mockito.inOrder(daoMock);
inOrder.verify(daoMock).save(1);
inOrder.verify(daoMock).save(1); // change 1 to 2 to fix test

Mockito.verify(daoMock);
}

}

注释部分不起作用=它通过了,但应该失败。

使用InOrder可以工作,但实际上我对顺序不感兴趣(例如,如果使用集合而不是列表,则顺序未知)。

有什么想法吗,或者我只是想做一些毫无意义的事情?

最佳答案

最好的方法是使用 ArgumentCaptor

service.saveAll(list);

ArgumentCaptor<Integer> values = ArgumentCaptor.forClass(Integer.class);
verify(daoMock, times(list.size())).save(values.capture());
assertEquals(list, values.getAllValues());

ArgumentCaptor 使您可以访问曾经传递给此方法的所有值。所以不用担心这个方法是否被“额外”调用了多次;相同的值在原始列表中出现两次也没有问题。

关于java - Mockito 中的连续通话测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193783/

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