/** Test of correct use of startProcess */
  @Test(expected = UnsatisfiedContextParameterException.class)
  public void testStartProcessValidationException() {
    expect(processFactory.createProcessModel(processName, processDefinitionName, contextParameters))
        .andReturn(mockProcessModel);
    expect(processDefinitionFactory.getProcessDefinition(processDefinitionName))
        .andReturn(mockProcessDefinition);

    replay(processFactory, processDefinitionFactory);
    final DefaultBusinessProcessService defaultService =
        new DefaultBusinessProcessService() {
          @Override
          protected void validateContext(
              final BusinessProcessModel processModel, final ProcessDefinition processDefinition) {
            assertEquals(
                "mockProcessModel not equals to processModel", mockProcessModel, processModel);
            assertEquals(
                "mockProcessDefinition not equals to processDefinition",
                mockProcessDefinition,
                processDefinition);
            throw new UnsatisfiedContextParameterException();
          }
        };
    defaultService.setProcessFactory(processFactory);
    defaultService.setProcessDefinitionFactory(processDefinitionFactory);
    defaultService.setModelService(modelService);
    defaultService.setTransactionTemplate(transactionTemplate);

    defaultService.startProcess(processName, processDefinitionName, contextParameters);
    verify(processFactory, processDefinitionFactory);
  }
  @Test
  public void testValidateContext() {
    processDefinitionName = "process1";
    expect(processFactory.createProcessModel(processName, processDefinitionName, contextParameters))
        .andReturn(mockProcessModel);
    expect(processDefinitionFactory.getProcessDefinition(processDefinitionName))
        .andReturn(mockProcessDefinition);
    final Map params = new HashMap<String, ContextParameterDeclaration>();
    final Map nodes = new HashMap<String, Node>();

    final Node node =
        new Node() {

          @Override
          public void trigger(final BusinessProcessModel process) {
            // null
          }

          @Override
          public String execute(final BusinessProcessModel process)
              throws RetryLaterException, NodeExecutionException {
            return "OK";
          }

          @Override
          public String getId() {
            return "NodeId";
          }
        };
    nodes.put("NodeId", node);
    mockProcessDefinition =
        new ProcessDefinition(
            processDefinitionName,
            node,
            null,
            nodes,
            params,
            "de.hybris.processengine.model.BusinessProcessModel") {
          // null
        };

    final DefaultBusinessProcessService defaultService = new DefaultBusinessProcessService();
    try {
      defaultService.validateContext(mockProcessModel, mockProcessDefinition);
    } catch (final UnsatisfiedContextParameterException exception) {
      fail("validateContext throws " + exception.toString());
    }
  }
  /** Test of correct use of startProcess */
  @Test
  public void testStartProcess() {
    expect(processFactory.createProcessModel(processName, processDefinitionName, contextParameters))
        .andReturn(mockProcessModel);
    expect(processDefinitionFactory.getProcessDefinition(processDefinitionName))
        .andReturn(mockProcessDefinition);

    modelService.save(mockProcessModel);

    mockProcessDefinition.start(mockProcessModel);

    replay(processFactory, processDefinitionFactory, modelService);
    final DefaultBusinessProcessService defaultService =
        new DefaultBusinessProcessService() {
          @Override
          protected void validateContext(
              final BusinessProcessModel processModel, final ProcessDefinition processDefinition) {
            assertEquals(
                "mockProcessModel not equals to processModel", mockProcessModel, processModel);
            assertEquals(
                "mockProcessDefinition not equals to processDefinition",
                mockProcessDefinition,
                processDefinition);
          }
        };
    defaultService.setProcessFactory(processFactory);
    defaultService.setProcessDefinitionFactory(processDefinitionFactory);
    defaultService.setModelService(modelService);
    defaultService.setTransactionTemplate(transactionTemplate);

    defaultService.startProcess(processName, processDefinitionName, contextParameters);
    verify(processFactory, processDefinitionFactory, modelService);
    assertEquals(
        "mockProcessModel.getState() not in RUNNING state",
        ProcessState.RUNNING,
        mockProcessModel.getState());
  }