【问题标题】:Using a mocked object form multiple threads使用模拟对象形成多个线程
【发布时间】: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并不能解决问题。)

【问题讨论】:

    标签: multithreading easymock


    【解决方案1】:

    好的,我用

    解决了问题
    EasyMock.expectLastCall().andAnswer(new IAnswer<List>() { ... });
    

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 2013-05-06
      • 2021-12-22
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多