java - ArgumentCaptor 的问题和对相同方法的连续调用(错误或功能?)

标签 java unit-testing mockito

ArgumentCaptor 无法记录时遇到问题 多次调用同一个方法时的参数。 基本上这似乎不起作用:

List<Dummy> mList = mock(List.class);
Dummy dummy = new Dummy();
when(mList.get(anyInt())).thenReturn(dummy);

Dummy d = mList.get(12);
d.setName("John");
mList.add(d);

Dummy g = mList.get(10);
g.setName("Ben");
mList.add(g);
...

verify(mymock, times(3)).doStuff(captor.capture)); 
assertEquals("John", captor.getAllValues().get(0).getName()); 
assertEquals("Ben", captor.getAllValues().get(1).getName()); 
assertEquals("Don", captor.getAllValues().get(2).getName()); 

getName() 的值始终设置为“Don”。 我也尝试过使用 InOrder,结果相同。

功能(我很愚蠢)还是错误?

为了更好地解释这个问题,我创建了一个用例: http://pastebin.com/RE1UzJ4F

干杯

最佳答案

iwein 是正确的;但是,有些情况下(例如嵌入式系统)内存不足,您不想使用或不能使用不变性。

我发现的一种解决方法是对每个调用使用不同的模拟,然后验证每个模拟都有一个调用的模拟列表。

List<Mock> mocks = new ArrayList<Mock>();
...init list w/ mocks using for loop...
List<Object[]> expectedArgs = new ArrayList<Object[]>();
..init list w/ desired args...

mocks.get(0).callMethod(1, 2);
 ...do that some more...

for(int i = 0; i < mocks.size(); i++) {
     Object[] desiredArgs = expectedArgs.get(i);
     verify(mocks.get(i)).callMethod((int) desiredArgs[0], (int) desiredArgs[1]);
 }

它不是那么漂亮,但是您不必通过这种方式让您的类不可变。

关于java - ArgumentCaptor 的问题和对相同方法的连续调用(错误或功能?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3333663/

相关文章:

java - 扩展 Eclipse 错误/警告机制以包含其他代码提示

java - Android - 单选按钮的共享首选项

python - 如何在不添加参数的情况下对基于时间的函数进行单元测试

java - Mockito 的问题

java - PowerMockito whenNew 返回 null

java - 如何在Jasper Report PDF导出中自动打开书签?

c# - 除了集成测试之外,单元测试是否会为这个 DAL 提供程序示例增加任何值(value)?

powershell - Pester 5.0.2 BeforeAll block 代码未显示在 Describe block 中

java - NoSuchMethodError : javassist. CtClass.getDeclaredClasses()

java - 如何将构造函数从父类(super class)继承到子类