Java 使用EasyMock测试简单的多线程代码,但得到了奇怪的结果

Java 使用EasyMock测试简单的多线程代码,但得到了奇怪的结果,java,multithreading,easymock,Java,Multithreading,Easymock,我正在使用EasyMock测试一个简单的多线程代码: 源代码: public class EasyMockTest { ExecutorService executorService; TestObject testObject; public EasyMockTest(ExecutorService executorService, TestObject testObject) { this.executorService = executo

我正在使用
EasyMock
测试一个简单的多线程代码:

源代码:

public class EasyMockTest {

    ExecutorService executorService;
    TestObject testObject;

    public EasyMockTest(ExecutorService executorService, TestObject testObject)
    {
        this.executorService = executorService;
        this.testObject = testObject;
    }
    public void test()
    {
        try
        {
            executorService.submit(() ->{
                testObject.doSomething(); 
            });
        }
        catch(RejectedExecutionException ex)
        {
        }
     }
}


public class TestObject {

    public void doSomething()
    {
    }
}
使用EasyMock测试代码:

public class EasyMockTest_test {

    private TestObject testObject;
    private ExecutorService executorService;
    private EasyMockTest easyMockTest;

    @Before
    public void setUp()
    {
        executorService = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(1));
        testObject = EasyMock.createMock(TestObject.class);
        easyMockTest = new EasyMockTest(executorService, testObject);
    }

    @Test
    public void test_easyMockTest()
    {
        testObject.doSomething(); 
        EasyMock.expectLastCall().andAnswer(new IAnswer<Void>(){
            @Override
            public Void answer() throws Throwable {
                Thread.sleep(100);
                return null;
            }}).times(2);

        EasyMock.replay(testObject);
        easyMockTest.test();
        easyMockTest.test();
        easyMockTest.test();

        EasyMock.verify(testObject);
    }
}
此时间错误变为:

java.lang.AssertionError:验证时预期失败: TestObject.doSomething():预期值:3,实际值:2

为什么我给它2的时候结果是3


抱歉,我不是EasyMock方面的专家,非常感谢有人能提供帮助。

没有什么能确保在到达
验证
之前执行您的任务。你需要一些东西来加快执行速度

这项工作:

@试验 public void test_easyMockTest()抛出InterruptedException{ 倒计时闩锁=新倒计时闩锁(3)

testObject.doSomething();
EasyMock.expectLastCall()和answer(new IAnswer()){
@凌驾
公共无效答案()可丢弃{
倒计时();
返回null;
}}).次(2);
回放(testObject);
easyMockTest.test();
easyMockTest.test();
easyMockTest.test();
等待(1,时间单位秒);
验证(testObject);
}


在这里,我假设您真的希望捕获并忽略
拒绝执行异常。

是的,我稍后会找到原因。谢谢你建议倒计时!
EasyMock.expectLastCall().times(2).andAnswer(new IAnswer<Void>(){
        @Override
        public Void answer() throws Throwable {
            Thread.sleep(100);
            return null;
        }});
testObject.doSomething();
EasyMock.expectLastCall().andAnswer(new IAnswer<Void>(){
  @Override
  public Void answer() throws Throwable {
    latch.countDown();
    return null;
  }}).times(2);

EasyMock.replay(testObject);
easyMockTest.test();
easyMockTest.test();
easyMockTest.test();

latch.await(1, TimeUnit.SECONDS);

EasyMock.verify(testObject);