我的方法是这样的:
public void deploy(UserInput userInput) {
if (userInput is wrong)
return;
//start deployment process
}
userInput包含deploy方法中的各个检查。现在,我想对JUnit测试用户输入检查算法的行为是否正确(因此,如果部署过程是否开始,则取决于正确或错误的用户输入)。所以我需要用正确和错误的用户输入来测试它。我可以通过检查是否已部署任何内容来完成此任务,但在这种情况下,这非常麻烦。 所以我想知道在相应的JUnit测试中是否有可能知道部署方法是否已经中止(由于用户输入错误)? (顺便说一下,改变部署方法是没有选择的。)
答案 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则调用它。
它还可以让您单独测试验证和部署代码,避免您目前遇到的问题。