【发布时间】:2016-06-03 08:53:44
【问题描述】:
我继承了一段遗留代码,现在我正在努力解决有时会失败的测试。
测试设置如下:
ADao aDao = EasyMock.createNiceMock(ADao.class);
aDao.aCall(EasyMock.eq(anObject), EasyMock.eq(true));
EasyMock.expectLastCall().andReturn(TestHelper.getAList(anObject));
然后aDao 被传递给一些工作线程的控制器,控制器启动 N 个线程,测试使用事件队列与其中一个线程通信。
我遇到的问题是,当工作线程尝试使用模拟的 Dao 时,他们没有取回传递给 andReturn 的列表,而是它的副本,并且副本有时不完整。 TestHelper.getAList 返回一个包含 139 个项目的 ArrayList,但模拟有时会返回一个完美的副本,有时会返回一个包含 14 或 16 个项目的副本。我相信复制仍然在另一个线程中执行,因为迭代返回的列表会抛出 ConcurrentModificationException。
有没有办法让 EasyMock 要么 a/ 使用它设置的对象而不是副本,要么 b/ 在将对象传递给调用者之前完成复制?
(用makeThreadSafe(..., false)标记EasyMock并不能解决问题。)
【问题讨论】: