我正在使用JUnit和Mockito来测试一些类.该类本身从另一个类创建一个对象.一个名为testList的列表.这是我的代码:
public class A {
private ListFailed
Status finalStatus = Status.PASSED;
for (B be : this.getTestList()) {
if (be.getStatus() != Status.PASSED) {
finalStatus = Status.Failed;
break;
}
}
return status;
}
}
public Class B {
private Status status = Status.Failed;
public getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
在名为Test的类中测试getStatus和getTestList方法的最佳方法是什么.
非常感谢你….
最佳答案
我查看了你的ClassA,我想知道bList如何设置为任何东西.现在,除了null之外没有办法使它成为任何东西,这意味着getStatus每次都会抛出一个空指针异常.
您的问题是您正在考虑如何测试方法而不是考虑如何测试行为.这是一个问题的一个原因是您的类必须以某种方式适应您的应用程序的其余部分.为了确保它能够做到这一点,它需要某些行为,而不是每种方法中的某些细节.所以唯一有意义的测试是检查行为的测试.
也许更隐蔽的是,测试单个方法会让您专注于您实际编写的代码.如果您在编写测试时查看代码,那么您的测试将成为一个自我实现的预言.您可能错过了您的班级需要提供的一整套行为;但如果你只测试你班级提供的行为,你永远不会知道.
所以,回到手头的问题.我看到你的班级可能会实现四种,也许五种行为.也许还有更多 – 很难说你是否只向我们展示了代码,而不是规范.你应该为每一个写一个测试.我坚信每个测试的名称应该描述行为,而不是反映测试使用的方法的名称.在这种情况下,我可能会选择这样的名字.
public void statusIsPassedWhenEveryTestPassed()
public void statusIsFailedWhenEveryTestFailed()
public void statusIsFailedWhenSomeTestsPassedSomeFailed()
public void statusIsPassedWhenNoTests()
public void statusIsPassedWhenTestsNotSet() // this one currently fails
在每个测试中,我将创建一个ClassA对象,然后做任何必须做的事情来在对象中设置bList.最后,我会调用getStatus并声明返回值是我想要的.但重要的是,每个测试(除了最后一个)使用多个ClassA方法,因此这些不是单个方法的测试.