Héc*_*tor 10 java unit-testing
一Sample,如果状态可以删除S或P.我有这个测试:
@Test
public void canBeDeletedWhenStatusIsP() {
Sample sample = new Sample();
sample.setState("P");
assertTrue(sample.canBeDeleted());
}
@Test
public void canBeDeletedWhenStatusIsS() {
Sample sample = new Sample();
sample.setState("S");
assertTrue(sample.canBeDeleted());
}
Run Code Online (Sandbox Code Playgroud)
我应该走得更远吗?如何在无法删除样本时进行测试?例如:
@Test
public void cantBeDeletedWhenStatusINeitherPNorS() {
Sample sample = new Sample();
sample.setState("Z");
assertFalse(sample.canBeDeleted());
}
Run Code Online (Sandbox Code Playgroud)
这个测试有用吗?测试命名怎么样?这个逻辑测试会不够?
Gho*_*ica 13
SaintThread正在给你一个很好的"直接"答案.
但让我们退后一步.因为您在生产代码中做错了什么.最有可能的是,您的生产代码执行类似于表示样本状态的String的开关.不仅一次,而且在它提供的所有方法中.而且......这不是一个好的OO设计!
相反,你应该使用多态,如:
abstract class Sample {
boolean canBeDeleted();
// ... probably other methods as well
Run Code Online (Sandbox Code Playgroud)
和各种具体的子类一样
class ZSample extends Sample {
@Override canBeDeleted() { return false; }
// ...
Run Code Online (Sandbox Code Playgroud)
最后,你有
class SampleFactory {
Sample createSampleFrom(String stateIdentifier) {
// here you might switch over that string and return a corresponding object, for example of class ZSample
Run Code Online (Sandbox Code Playgroud)
然后,您的测试归结为:
关键是:您的代码确实完成了FSM(有限状态机)的工作.然后不要在整个地方使用if/elses; 相反,做OO的事情:创建一个显式的状态机.而且,免费奖励:这种方法也可以将你的Sample对象变成不可变的东西; 这通常比必须处理可以随时间改变其状态的对象更好(例如,不变性对多线程问题有很大帮助).
免责声明:如果您的"样本"类只是关于那一种方法,那么上述内容可能过度.但在任何其他情况下......也许退一步看看我的建议是否会为您的设计增添价值!
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |