java mock verify_java – Mockito;使用list调用verify方法,忽略列...

本文讨论了在使用Mockito进行单元测试时遇到的问题,即在不同操作系统上,文件列表的顺序不一致导致测试失败。作者提出了使用ArgumentCaptor进行排序后比较的解决方案,并表达了对更简洁解决方案的期望。测试类(ClassA)从目录中获取文件并传递给ClassB处理。测试目标是验证ClassB接收到的文件列表内容,而不关心顺序。
摘要由CSDN通过智能技术生成

我有一个类(ClassA)来获取目录中的文件.它扫描给定目录中与正则表达式匹配的文件.对于每个匹配的文件,它将文件对象添加到列表中.

处理完目录后,它会将文件列表传递给另一个类(ClassB)进行处理

我正在为ClassA编写单元测试,因此使用Mockito模拟ClassB,并将其注入ClassA.

然后我想在不同的场景中验证传递给ClassB的列表的内容(即我的模拟)

我已经将代码删除了以下内容

public class ClassA implements Runnable {

private final ClassB classB;

public ClassA(final ClassB classB) {

this.classB = classB;

}

public List getFilesFromDirectories() {

final List newFileList = new ArrayList();

// ...

return newFileList;

}

public void run() {

final List fileList = getFilesFromDirectories();

if (fileList.isEmpty()) {

//Log Message

} else {

classB.sendEvent(fileList);

}

}

}

测试类看起来像这样

@RunWith(MockitoJUnitRunner.class)

public class AppTest {

@Rule

public TemporaryFolder folder = new TemporaryFolder();

@Mock

private ClassB mockClassB;

private File testFileOne;

private File testFileTwo;

private File testFileThree;

@Before

public void setup() throws IOException {

testFileOne = folder.newFile("testFileA.txt");

testFileTwo = folder.newFile("testFileB.txt");

testFileThree = folder.newFile("testFileC.txt");

}

@Test

public void run_secondFileCollectorRun_shouldNotProcessSameFilesAgainBecauseofDotLastFile() throws Exception {

final ClassA objUndertest = new ClassA(mockClassB);

final List expectedFileList = createSortedExpectedFileList(testFileOne, testFileTwo, testFileThree);

objUndertest.run();

verify(mockClassB).sendEvent(expectedFileList);

}

private List createSortedExpectedFileList(final File... files) {

final List expectedFileList = new ArrayList();

for (final File file : files) {

expectedFileList.add(file);

}

Collections.sort(expectedFileList);

return expectedFileList;

}

}

问题是这个测试在Windows上完全正常,但在Linux上失败了.原因是在Windows上,ClassA列出文件的顺序与expectedList匹配,所以该行

verify(mockClassB).sendEvent(expectedFileList);

在Windows上导致问题excetdFileList = {FileA,FileB,FileC},而在Linux上它将是{FileC,FileB,FileA},因此验证失败.

问题是,我如何在Mockito中解决这个问题.有没有办法说,我希望用这个参数调用这个方法,但我不关心列表内容的顺序.

我确实有一个解决方案,我只是不喜欢它,我宁愿有一个更清洁,更容易阅读的解决方案.

我可以使用ArgumentCaptor获取传递给mock的实际值,然后对其进行排序,并将其与我的预期值进行比较.

final ArgumentCaptor argument = ArgumentCaptor.forClass(List.class);

verify(mockClassB).method(argument.capture());

Collections.sort(expected);

final List value = argument.getValue();

Collections.sort(value);

assertEquals(expecetdFileList, value);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值