是否有可能确定方法的回调,如果它的类型为void并且它的“return;”已经跳过执行?

时间:2011-12-21 10:59:35

标签: junit callback void java-6

我的方法是这样的:

public void deploy(UserInput userInput)  {
   if (userInput is wrong)
      return;

   //start deployment process
}

userInput包含deploy方法中的各个检查。现在,我想对JUnit测试用户输入检查算法的行为是否正确(因此,如果部署过程是否开始,则取决于正确或错误的用户输入)。所以我需要用正确和错误的用户输入来测试它。我可以通过检查是否已部署任何内容来完成此任务,但在这种情况下,这非常麻烦。 所以我想知道在相应的JUnit测试中是否有可能知道部署方法是否已经中止(由于用户输入错误)? (顺便说一下,改变部署方法是没有选择的。)

2 个答案:

答案 0 :(得分:2)

在描述您的问题时,您只能检查方法是否有副作用,或者是否会引发异常。最简单的方法是使用像JMockit或Mockito这样的模拟框架。在检查用户输入完成后,您必须模拟第一个方法:

public void deploy(UserInput userInput)  {
   if (userInput is wrong)
      return;

   //start deployment process
   startDeploy(); // mock this method
}

您还可以扩展测试中的类,并在可能的情况下覆盖startDeploy()。这样可以避免使用模拟框架。

替代方案 - 集成测试

这听起来像部署方法庞大而复杂,并且处理文件,文件系统,外部服务(ftp)等。

从长远来看,有时更容易接受您正在处理外部系统,并测试这些外部系统。例如,如果deploy()将文件复制到目录x,则测试该文件是否存在于目标目录中。我不知道部署的复杂程度,但经常嘲笑这些方法可能就像测试实际行为一样困难。这可能很麻烦,但与大多数测试一样,它允许您重构代码,因此更容易理解。如果你的目标是重构,那么根据我的经验,如果你测试的是实际行为而不是模仿,那么重构会更容易。

答案 1 :(得分:0)

您可以使用正确的期望创建一个UserInput存根/模拟,并验证是否只进行了预期的调用(而不是更多)。

但是,从设计的角度来看,如果您能够将验证和部署过程分成不同的类 - 那么您的代码可以像以下一样简单:

if (_validator.isValid(userInput)) {
  _deployer.deploy(userInput);
}

通过这种方式,您可以轻松地测试如果验证器返回false,则永远不会调用部署者(使用模拟框架,例如jMock),并且如果验证器返回true则调用它。

它还可以让您单独测试验证和部署代码,避免您目前遇到的问题。