Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Mockito设置struts 1.0表单类成员_Java_Mockito_Struts 1 - Fatal编程技术网

Java 如何使用Mockito设置struts 1.0表单类成员

Java 如何使用Mockito设置struts 1.0表单类成员,java,mockito,struts-1,Java,Mockito,Struts 1,我有一个struts 1.0表单bean,我正在尝试测试自定义验证 表单bean显式引用其类成员,即在验证电子邮件地址时,调用如下所示: @Override public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); Validator validator = ESAPI.valid

我有一个struts 1.0表单bean,我正在尝试测试自定义验证

表单bean显式引用其类成员,即在验证电子邮件地址时,调用如下所示:

  @Override
  public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
  {
    ActionErrors errors = new ActionErrors();
    Validator validator = ESAPI.validator();

    try
    {
      email = validator.getValidInput("AuthorizedPayerEmailAddr", email, "Email", Email.MAX_ADDRESS_SIZE, true);
    }catch(Exception e){ doStuff() }
      email = validator.getValidInput("AuthorizedPayerEmailAddr", getEmail(), "Email", Email.MAX_ADDRESS_SIZE, true);
在我的测试类中,我尝试告诉Mockito调用setter和getter的实际方法:

  AddAuthorizedPayerForm form = Mockito.mock(AddAuthorizedPayerForm.class);    
  Mockito.doAnswer(Answers.CALLS_REAL_METHODS.get()).when(form).getEmail();
  Mockito.doAnswer(new CallsRealMethods()).when(form).setEmail(Mockito.anyString());
此技术导致未设置我的表单类成员

我唯一能让它起作用的方法就是嘲弄获得者

when(form.getEmail())。然后返回(emailString)

然后通过如下方法更改form类以访问其字段:

  @Override
  public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
  {
    ActionErrors errors = new ActionErrors();
    Validator validator = ESAPI.validator();

    try
    {
      email = validator.getValidInput("AuthorizedPayerEmailAddr", email, "Email", Email.MAX_ADDRESS_SIZE, true);
    }catch(Exception e){ doStuff() }
      email = validator.getValidInput("AuthorizedPayerEmailAddr", getEmail(), "Email", Email.MAX_ADDRESS_SIZE, true);
这正是我不想做的!我不想仅仅为了使其可测试而改变我的表单逻辑


附加上下文:有一些抽象方法可以在用户会话上下文中的运行时设置表单状态。我知道这是一个糟糕的设计(FormBean应该只是一个FormBean),但我无法修复它。此应用程序不使用任何dep注入,因此我需要对此表单进行模拟,但
validate()
方法及其验证的表单字段除外。

能否在表单上放置setter(从而不更改getter逻辑)直接在表单对象上设置变量作为测试设置的一部分?Mockito关闭了那扇门。因为我是从一个模拟实例开始的,所以对任何setter/getter对的调用都是手动进行的,而不涉及实际的代码?如果你嘲笑它,你怎么能测试它?我想我缺少了一些东西,我希望表单类上的所有方法/字段都被模拟,除了对setter/getter的调用和对
validate()
方法的调用。当我翻阅文档时,看起来我需要使用
spy