【问题标题】:Can I check in unit test, that some method was called 2 times? How?我可以检查单元测试,某些方法被调用了 2 次吗?如何?
【发布时间】:2021-08-17 03:44:01
【问题描述】:

我有 BPMN 项目并使用 Camunda。

我有委托类,它检查具有相同旅程代码和状态的进程是否存在重复:

@Component
public class CheckIsDuplicateDepartedJourneyProcessedDelegate implements JavaDelegate {
  @Override
  public void execute(DelegateExecution execution) throws Exception {
    String currentProcessInstanceId = execution.getProcessInstanceId();
    String journeyCode = DelegateExecutionUtils.getStringVariable(execution, JOURNEY_CODE);
    String journeyStatus = DelegateExecutionUtils.getStringVariable(execution, TRIP_STATUS);
    boolean hasDuplicate =
        execution
            .getProcessEngine()
            .getRuntimeService()
            .createProcessInstanceQuery()
            .processDefinitionKey(UPDATE_JOURNEY_STATUS_PROCESS_ID)
            .processInstanceBusinessKey(journeyCode)
            .variableValueEquals(TRIP_STATUS, journeyStatus)
            .list()
            .stream()
            .anyMatch(process -> !process.getProcessInstanceId().equals(currentProcessInstanceId));
    execution.setVariable(DUPLICATE_PROCESS, hasDuplicate);
  }
}

如何检查单元测试,该方法 execute(...) 或 execution.getProcessInstanceId() 被调用了 2 次(在 2 个进程中的每个进程中调用 1 次)?我需要检查 2 个进程是否正常工作,并想追踪委托中提到的某些方法是否在每个进程中调用一次(2 个进程中的 2 个)。

我当前的单元测试。它工作得不好,因为说,该方法 execute(...) 没有被调用。

public class UpdateJourneyStatusProcessTest extends BaseTest {

  @Spy private CheckIsDuplicateDepartedJourneyProcessedDelegate checkDelegate = new CheckIsDuplicateDepartedJourneyProcessedDelegate();
   ...
    // when
    sender.send(firstCommand); // recieving this command initiates process and delegate work
    sender.send(secondCommand);

    // then
    verify(checkDelegate, times(2)).execute(any(DelegateExecution.class)); // says that method was called 0 times
    ...

  }
}

非常感谢您的帮助。

【问题讨论】:

  • 更新了答案。这有帮助吗?

标签: java spring unit-testing bpmn camunda


【解决方案1】:

我认为最好的方法是设置单个进程并检查是否未设置 DUPLICATE_PROCESS。

然后设置一个额外的(重复的)进程,调用你的方法,然后检查你的 DUPLICATE_PROCESS 是否设置。

我不确定我是否了解所有细节,但我假设您可以通过直接调用命令来启动这些进程。

【讨论】:

  • 是的,我通过发送命令启动我的进程,当 camunda 收到命令时它启动进程。在提到的情况下,我担心当我检查 DUPLICATE_PROCESS 并启动第二个过程时,第一个过程可以完成并且 DUPLICATE_PROCESS 将是错误的。这就是我一起发送 2 个命令的原因。
【解决方案2】:

您发布的代码不完整,因此我不确定是否完成了此工作的一个重要步骤。也许这就是问题所在。

检查是否调用了 execute(...) - sender 对象应该具有模拟对象 - checkDelegate。
或者
要检查是否调用了 execution.getProcessInstanceId() - 您应该创建一个模拟 DelegateExecution execution 并将其设置在 checkDelegate 对象中。

您可以通过构造函数传递它,也可以在初始化后在 UnitTest 中设置它。

【讨论】:

    【解决方案3】:

    您是在运行普通 Java 测试还是 Spring 测试?

    流程引擎将按照您在流程模型中指定的方式解析委托。如果您的流程模型正在引用 Java 类,那么无论如何它都会实例化该类。如果您使用的是 Delegate 表达式,那么您将按名称引用 Spring bean。 由于您在测试中实例化 CheckIsDuplicateDepartedJourneyProcessedDelegate,我认为它不是 Spring 测试,而是纯 Java。在纯 Java 测试中,您必须确保 Camunda 可以解析 bean 名称。这是使用 Mocks.register(...) 完成的。您是否在流程 mdoel 中的 Delegate 表达式中使用 bean 名称注册了您的 @spy bean?

    我不会使用委托而是使用表达式,然后根本不在委托级别检查它,而是使用正常断言检查两个流程实例是否遵循所需的路径,例如assertThat(pi).hasPassed("somewhere").isWaitingAt("someTask");

    这是一个示例模型,其中包含一个可用于实现单例行为的表达式。您可以按照委托实现中显示的方式调整表达式。

    https://github.com/rob2universe/process-models/blob/798c2097fffc330be7dc498f0354b02dc32410c6/bpmn/singleton.bpmn#L15

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2020-05-01
      相关资源
      最近更新 更多