当前位置: 首页 > 面试题库 >

junit测试类的以下代码

海保臣
2023-03-14
问题内容

如何为Phone对象模拟对象。

波纹管

public class Fortest {

  UserDao userdao = new UserDao();
  Phone name = new Phone();
  public String handleUser(User user) {

    String returncode="failed";
    //User usr = new User("bob");
    String username=user.getUsername();
    String pass=user.getPass();
    System.out.println("username and password : "+username+" : "+pass);

    Phone name = new Phone();
    String ph = name.getA();
    System.out.println("ph "+ph);

    if(ph.equalsIgnoreCase("test")){
      System.out.println("A "+ph);
      returncode="done";
    }
    System.out.println("returning "+returncode);

    return  returncode;
    //System.out.println("name "+name.toString());
    //System.out.println(name.getA());
  }
}

谢谢


问题答案:

首先,我要做一些假设。
user.getUsername()user.getPass()无副作用的影响。该System.out.println是对你并不重要。

这样,您的课程就变成了:

public class Fortest {
    Phone name = new Phone();

    public String handleUser(User user) {
        String ph = name.getA();

        if(ph.equalsIgnoreCase("test")){
            return "done";
        }

        return  "failed";

    } 
}

因此,您的测试有两个条件。要么phone.getA()是“测试”,然后返回“完成”,要么不是,然后返回“失败”。

那么如何设置设置为“
getA”。可以肯定的是,我们需要能够从测试中设置“名称”。为此,我们需要“注入”它(我们可以通过其他多种方式来实现它,但是我喜欢注入)。我会用Guice,许多人会用Spring。有些人会使用其他注入框架之一。但是在测试中,我们大多数人会使用手动注射。

public class Fortest {
    Phone name;
    Fortest(Phone name) {
        this.name = name;
    }

    public String handleUser(User user) {
        String ph = name.getA();

        if(ph.equalsIgnoreCase("test")){
            return "done";
        }

        return  "failed";

    } 
}


public class TestFortest {
   @Before
   public void before() {
          name = ; //... 
          subject = new Fortest(name);
   }
}

现在测试非常简单:

public void whenTestModeIsEnabledThenReturnDone() {
     setPhoneIntoTestMode();
     String actual = subject.handleUser(null);
     assertEquals(actual, "done");
}

public void whenTestModeIsDisabledThenReturnFailed() {
     setPhoneIntoLiveMode();
     String actual = subject.handleUser(null);
     assertEquals(actual, "failed");
}

setPhoneIntoTestMode/
的实现setPhoneIntoLiveMode取决于复杂Phone程度。如果它比我们要复杂的话,我们会以某种方式(模拟,存根等)看待它。这可能是您编写的代码块,也可能使用了Mocketo之类的工具。

如果Phone对象很简单,并且具有或可以具有“ setA”方法,则只需使用该方法。

我相信以后你将需要userdao。届时将做同样的事情。注入并模拟/设置对象。



 类似资料:
  • 我能得到第二个和第三个条件的承保范围,但不能得到最后一个和第一个条件的承保范围。 下面这个是我的测试函数

  • 我有一个项目结构: 我用mvn clean:install构建了它,并创建了jar文件。现在,我想使用命令行运行QbsApplicationTests。为此,我在一个目录中放入了两个罐子: 并执行以下命令: 然而,我不断得到以下错误 问题: 我应该如何从控制台运行QbsApplicationTests测试 编辑我还尝试添加以下内容: 到主类,但Intellij一直说无法解析。

  • 我一直在设置一些合约JUnit 4测试(遵循回答这个问题的建议) - 例如,如果我有一个接口(我已经在示例中包含了泛型,因为我在我的项目中使用它们) - 但是,这是一个大大简化的示例: 我可以创建一个抽象的合同测试,例如: ...并为每个实现扩展此抽象测试类(我使用。我还将一些变量传递给抽象测试类,以测试接口的实现。 然而,实际上,一些接口返回的对象是其他接口的实现,我希望能够使用该接口的抽象契约

  • 我找到了关于如何从Java中启动JUnit 4测试用例的说明,但是还没有找到在JUnit 5测试用例上启动测试的结构。 我尝试的JUnit 4解决方案是这样的:如何从我的java应用程序内部运行JUnit测试? 我一直在尝试让JUnit5中的控制台启动器工作,但它会引发异常。这记录在这里:http://junit.org/junit5/docs/current/user-guide/#runnin