gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:02:45 29 4
gpt4 key购买 nike

我正在使用 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);
}
}

我认为在这种情况下 testObject.doSomething() 应该只被调用两次。由于线程池有一个线程并且队列大小为一,所以我让前两个线程 hibernate 。因此,当我提交三个任务时,第三个任务应该被拒绝,而前两个任务应该被调用。但是当我运行这段代码时有错误:

java.lang.AssertionError:
Expectation failure on verify: TestObject.doSomething(): expected: 2, actual: 1 at org.easymock.internal.MocksControl.verify(MocksControl.java:225) at org.easymock.EasyMock.verify(EasyMock.java:2007) ...

这意味着该方法只被调用一次,我无法理解。

我还尝试了注释Thread.sleep(100);这次实际调用次数变成了2,但我认为应该是3,因为没有线程在 hibernate 。

然后我尝试像这样移动 .times() 位置:

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

这次错误变成:

java.lang.AssertionError: Expectation failure on verify: TestObject.doSomething(): expected: 3, actual: 2

为什么当我给它 2 时,结果却期望 3?

抱歉,我不是 EasyMock 方面的专家,如果有人可以提供帮助,我真的很感激。

最佳答案

没有什么可以确保在达到验证之前执行您的任务。您需要一些东西来调整执行速度。

这有效:

@测试 公共(public)无效test_easyMockTest()抛出InterruptedException { CountDownLatch 闩锁 = new CountDownLatch(3);

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);

}

这里我假设您确实希望捕获并忽略 RejectedExecutionException

关于java - 使用 EasyMock 测试简单的多线程代码,但得到了奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543510/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com