gpt4 book ai didi

java - 对于 Junit 问题 : when test multiple thread

转载 作者:行者123 更新时间:2023-12-02 06:38:38 24 4
gpt4 key购买 nike

我使用 JDK ScheduledThreadPoolExecutor 来执行 schdule 工作。我给出简单的代码如下。

 class Job implements  Callable<Void>{
public Long id;

@Override
public Void call() throws Exception {
if (!isOk(id)) {
return null;
}

_context.exe(id);
return null;
}


void setId(Long id) {
this.id = id;
}
}

每次我将此作业添加到安排服务时:

public void schedule() {
Job job = new Job();
job.setId(1L);;
_scheduledExecutor.schedule(job, 1000, TimeUnit.MILLISECONDS) ;
}

此作业将延迟调用上下文的 exe 方法。我的问题:我想调用assert_context的exe方法吗?我怎样才能做到这一点?

我目前所做的,我尝试添加登录 call() 方法并通过我的眼睛验证 UT。PS:对于这个UT,我也尝试模拟_context的exe方法,但是作业在其他线程中运行,所以我无法在当前线程中断言它。有人有想法帮我为这种情况写断言吗?

目前我采用以下方式,但我仍然认为有更好的解决方案,只是我不知道。

_context 是 Context 的实例,我从此类扩展。

public class UTContext extends Context {
public UTTestCase utTestCase ;

@Override
public void exe(Long id) {
utTestCase.setIsCall(true);
}

public void setUtTestCase(UTTestCase utTestCase) {
this.utTestCase = utTestCase;
}

}

然后我将在 UT 中断言 isCall var。

有人对此有好的想法吗,请给我答案。非常感谢。

最佳答案

您正在测试调用层次结构中间的一部分,即线程创建者/调度程序代码。这意味着您必须从顶部驱动代码并从顶部或底部进行测试。执行此操作的方式有多种模式。

要么测量底部 (exe(id)),要么从顶部测量。由于调度延迟,从顶部进行测量变得非常困难。

exe() 有副作用吗?您的测试代码可以测试该副作用吗?您能推断出一次 exe() 调用的操作吗?你能推断出不止一个的调用吗?如果其中任何一个的答案是“否”,那么您将不得不走得更远。

@RamonBoza 提供了一个很好的解决方案。

您还可以创建类 Job 的可测试版本,因此:

class JobUT extends Job {
@Override
public Void call() throws Exception {
Void result = super.call();
// Report error if wrong return result
}
}

(我知道上述代码存在问题,因为 Void 没有得到正确处理。我无法重构您的代码。)

您还可以使用面向方面的编程来实现相同的目标,在调用完成后拦截该调用并执行相同的测试。

关于java - 对于 Junit 问题 : when test multiple thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381129/

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