@Before
  public void setup() {
    mockAccountDao = mock(AccountDao.class);
    mockFormDao = mock(FormDao.class);
    mockFormFieldDao = mock(FormFieldDao.class);
    mockAccountService = mock(AccountService.class);

    account = new Account();
    account.setId(1L);
    form = new Form();
    form.setAccount(account);
    form.setFields(new ArrayList<FormField>());
    field = new FormField();
    field.setForm(form);
    form.getFields().add(field);

    when(mockAccountDao.findByUsernameOrEmail("user")).thenReturn(account);
    when(mockFormDao.findById(1L)).thenReturn(form);
    when(mockFormFieldDao.findById(1L)).thenReturn(field);

    formService = new FormService();
    formService.setAccountDao(mockAccountDao);
    formService.setMapper(mapper);
    formService.setFormDao(mockFormDao);
    formService.setFormFieldDao(mockFormFieldDao);
    formService.setAccountService(mockAccountService);
  }
  /**
   * 跳转到任务执行页面
   *
   * @param request
   * @return
   */
  @RequestMapping(value = "/form.do")
  public String from(
      HttpServletRequest request, @RequestParam("taskId") String taskId, Model model) {

    List<Task> taskList = taskService.createTaskQuery().taskId(taskId).list();
    Task task = taskList.get(0);
    // 获取表单数据
    TaskFormData tfd = formService.getTaskFormData(taskId);
    List<FormProperty> fpList = tfd.getFormProperties();

    Map map = runtimeService.getVariables(task.getExecutionId());

    List<ActivityImpl> activityList = new ArrayList<ActivityImpl>();

    try {
      // 查找所有可驳回的节点
      activityList = processExtensionService.findBackActivity(taskId);
      // model.addAttribute("activityList",activityList);
    } catch (Exception e) {
      e.printStackTrace();
    }

    //        model.addAttribute("task",task);
    //        model.addAttribute("fpList",fpList);
    //        model.addAttribute("map",map);
    //        model.addAttribute("taskId",taskId);

    request.setAttribute("task", task);
    request.setAttribute("fpList", fpList);
    request.setAttribute("map", map);
    request.setAttribute("taskId", taskId);
    request.setAttribute("activityList", activityList);

    return "/simple/form";
  }
  @Test
  public void deleteFormField() {
    formService.deleteField(1L, 1L, "user");

    ArgumentCaptor<FormField> argument = ArgumentCaptor.forClass(FormField.class);
    verify(mockFormFieldDao).delete(argument.capture());

    assertEquals(field, argument.getValue());
  }
  @Test
  public void modifyForm() {
    ModifyFormDTO dto = new ModifyFormDTO();
    dto.setName("new name");

    formService.modifyForm(1L, dto, "user");

    ArgumentCaptor<Form> argument = ArgumentCaptor.forClass(Form.class);
    verify(mockFormDao).update(argument.capture());

    assertEquals("new name", argument.getValue().getName());
  }
  @Test
  public void createForm() {
    CreateFormDTO createFormDTO = new CreateFormDTO();
    createFormDTO.setName("Dangerous Speech Categorisation");

    formService.createForm(createFormDTO, "user");

    ArgumentCaptor<Form> argument = ArgumentCaptor.forClass(Form.class);
    verify(mockFormDao).create(argument.capture());

    Form form = argument.getValue();
    assertEquals("Dangerous Speech Categorisation", form.getName());

    verify(mockAccountService).logActivity(account, ActivityType.CREATE, form);
  }
  @Test
  public void modifyFormField() {
    ModifyFormFieldDTO dto = new ModifyFormFieldDTO();
    dto.setTitle("New Title");
    dto.setType("multiple");
    dto.setRequired(false);
    dto.setDescription("New Description");
    dto.setOptions(new ArrayList<String>());
    dto.getOptions().add("New Option");

    formService.modifyField(1L, 1L, dto, "user");

    ArgumentCaptor<FormField> argument = ArgumentCaptor.forClass(FormField.class);
    verify(mockFormFieldDao).update(argument.capture());

    FormField field = argument.getValue();
    assertEquals("New Title", field.getTitle());
    assertEquals("multiple", field.getType());
    assertEquals(false, field.getRequired());
    assertEquals("New Description", field.getDescription());
    assertEquals("[\"New Option\"]", field.getOptions());
  }
  @Test
  public void createField() {
    CreateFormFieldDTO dto = new CreateFormFieldDTO();
    dto.setTitle("field title");
    dto.setType("multiple");
    dto.setRequired(true);
    dto.setDescription("field description");
    dto.setOptions(new ArrayList<String>());
    dto.getOptions().add("Test Option");

    formService.createField(1L, dto, "user");

    ArgumentCaptor<FormField> argument = ArgumentCaptor.forClass(FormField.class);
    verify(mockFormFieldDao).create(argument.capture());

    FormField field = argument.getValue();
    assertEquals("field title", field.getTitle());
    assertEquals("multiple", field.getType());
    assertEquals(true, field.getRequired());
    assertEquals("field description", field.getDescription());
    assertEquals("[\"Test Option\"]", field.getOptions());
  }