0

我使用 JDK ScheduledThreadPoolExecutor 来做调度工作。我给出如下简单的代码。

 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 方法。我的问题:我想调用或不调用断言_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。

有没有人对此有好主意,请给我答案。非常感谢。

4

3 回答 3

2

您正在测试调用层次结构的中间部分,即线程创建者/调度程序代码。这意味着您必须从顶部驱动代码并从顶部或底部进行测试。你如何做到这一点有几种模式。

您可以使用底部 ( exe(id)) 进行测量,也可以从顶部进行测量。由于调度延迟,从顶部进行测量变得非常困难。

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

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

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

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

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

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

于 2013-10-15T13:52:35.240 回答
0

在服务器日之后,我现在知道如何验证它。我附上了其他问题以供参考:

断言 expectLastCall 的时间

Service service = EasyMock.createMock(Service.class);
service.applyInitialDump(entities);
EasyMock.expectLastCall().times(100);

processor.processInitialDump(entities)
EasyMock.verify(service);
于 2014-01-15T05:48:22.900 回答
0

对于多线程的断言,我通常创建“N”个线程,并为每个线程分配一个不同的值。

然后将它们全部加入,最后检查每个线程的数据是否存储?例如。

想象一下,您创建了 1000 个线程,将整数存储到数据库中,因此在这 1000 个线程完成后,您必须检查数据库中是否存储了所有数据。

更难的测试是集成测试,需要使用不同的场景和中间件(OpenNebula、亚马逊云等)来执行。

于 2013-10-15T12:27:14.067 回答