gpt4 book ai didi

java - 在测试期间阻止线程以检查其状态的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 05:48:22 24 4
gpt4 key购买 nike

使用 Java 进行测试(使用 Mockito 和 Powermock,但愿意使用任何可以解决此问题的方法)。我有一个具有以下签名的对象:

public class MyClass {
public void doRun() {
//Do work
}

public int numberComplete() {
//Return number of items complete
}
}

“doRun”方法获取项目列表并“完成”它们(每个项目都需要相当长的时间)。为了“获取”和“完成”一个项目,使用了模拟管理器,所以我有如下测试:

@Test public void managerIsInformedOfEachFinishedItem() {
task.doRun();
verify(mockManager, times(3)).finish((Item)any());
}

最后,我可以调用“task.numberComplete()”并看到任务确实返回 3。但是,我真正想做的是:

@Test public void managerIsInformedOfEachFinishedItem() {
int count1, count2;
when(mockManager.finish(item1).thenSet(count1 = task.numberComplete());
when(mockManager.finish(item2).thenSet(count2 = task.numberComplete());

task.doRun();

assertEquals(1, count1);
assertEquals(2, count2);
}

我意识到这可能不是已经可用的东西。但是,如果您打算尝试实现这样的东西(无论语法如何 - 我不关心测试最初读取的内容有多干净),您会怎么做?任何建议/想法表示赞赏!

最佳答案

您可以实现自己的模拟管理器,在其 finish 方法中为您进行验证,而不是为管理器使用第三方模拟框架。请记住,如果 finish 将在不同的线程中调用,那么您不应该将 assertEquals 放在那里,因为其中会抛出 AssertionError线程很可能会被忽略。相反,您可以将成功/失败结果存储在模拟管理器的成员变量(属性)中,然后从测试中检查该结果。 (不要忘记同步对该共享结果值的访问或使用 atomic 来保存它。)

关于java - 在测试期间阻止线程以检查其状态的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314599/

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