【问题标题】:Unit Testing quartz-dot-net (Quartz.Net) Execute function单元测试quartz-dot-net (Quartz.Net) 执行功能
【发布时间】:2014-06-19 17:27:57
【问题描述】:

我想测试我的 Quartz.Net 作业的执行功能,它实现了 Quartz.IJob:

public void Execute(IJobExecutionContext context)

问题:如何创建一个新的 IJobExecutionContext 类实例。或者甚至不创建一个新的,而是从一个已经存在的计划作业中获取它。

目标是创建一个测试,例如:

[Test()]
public void Test()
{
    IJobExecutionContext jobExecutionContext = ???; //get a defined JobExecutionContext somehow...
    m_myJob.Execute(jobExecutionContext);
}

我发现的都是this related post 有同样的问题。他所说的只是“通过仅将 JobDataMap 对象传递给我的方法来解决:context.MergedJobDataMap”,我似乎无法重现。而另一个提议,即起订量的使用,目前对我来说是遥不可及的。虽然如果它真的是唯一的方法,我将专注于这个解决方案。不过我觉得还是先找个更简单的方法比较合理。

【问题讨论】:

  • 你有实现IJobExecutionContext接口的类吗?你可以使用它们。
  • 不,我没有。这是 Quartz.Net 调用作业的主要执行的一种内部方式。 IJobExecutionContext 有 17 种方法要实现。这就是为什么我认为从已经安排好的作业中“裁剪”现有作业会更简单。但即便如此,我似乎也无法完成。
  • 如果适合你使用Quartz.Net的内部类而不是test doubles,你可以使用汇编属性InternalsVisibleToAttribute

标签: c# quartz.net


【解决方案1】:

IJobExecutionContext 是一个接口,这意味着您可以轻松地创建它的模拟版本。通过使用 Mocking 框架,如您提到的 Moq,或者通过创建一个仅用于您的测试的类

private class MockExecutionContext : IJobExecutionContext 
{


}

您需要实现接口的所有成员,并为它们提供您的测试所需的行为,但编译器/智能感知会帮助您。根据您正在测试的内容,您应该能够为大多数成员提供除了满足成员签名之外什么都不做的“存根”实现。

【讨论】:

  • 我试了一下,一切正常。由于其中一个依赖项,我不得不在类实现方面更深入,但由于我只需要 JobMap,所以其他 16 个函数实现可以保留为“存根”实现,正如你所说。我觉得这不是更清洁的解决方案,但它适用于我的目的。谢谢!
  • @XavierPeña - 我意识到这是很久以前的事了,但如果你能发布那个模拟实现会很酷
猜你喜欢
  • 2023-03-19
  • 2010-09-21
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
相关资源
最近更新 更多