gpt4 book ai didi

java - 我应该测试什么都不会发生的案例吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:55 26 4
gpt4 key购买 nike

如果状态为SP,则可以删除Sample。我有这个测试:

@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());
}

我应该更进一步吗?当样本不能被删除时,我该如何测试?例如:

@Test
public void cantBeDeletedWhenStatusINeitherPNorS() {
Sample sample = new Sample();
sample.setState("Z");
assertFalse(sample.canBeDeleted());
}

这个测试有用吗?测试命名呢?这种逻辑是否经过充分测试?

最佳答案

SaintThread 给你一个很好的“直接”答案。

但是让我们退后一步。因为您在生产代码中做错了什么。最有可能的是,您的生产代码会在表示示例状态的字符串上执行类似开关的操作。不仅一次,而且在它提供的所有方法中。而且...这不是一个好的 OO 设计!

相反,您应该使用多态性,例如:

abstract class Sample {
boolean canBeDeleted();
// ... probably other methods as well

有各种具体的子类,比如

class ZSample extends Sample {
@Override canBeDeleted() { return false; }
// ...

最后,你有

class SampleFactory {
Sample createSampleFrom(String stateIdentifier) {
// here you might switch over that string and return a corresponding object, for example of class ZSample

然后,您的测试归结为:

  1. 测试工厂;输入“Z”的示例,它返回 ZSample 的实例
  2. 测试您所有的 Sample 子类;例如,对于 ZSample
  3. 的实例,canBeDeleted() 返回 false

重点是:您的代码确实完成了 FSM(有限状态机)的工作。然后不要到处使用 if/elses;相反,做面向对象的事情:创建一个显式状态机。而且,免费奖励:这种方法还可以将您的 Sample 对象变成不可变的事物;这通常比必须处理可以随时间改变其状态的对象要好(因为不可变性对例如多线程问题有很大帮助)。

免责声明:如果您的“示例”类只是关于那个方法,那么上面的方法可能有点矫枉过正。但在任何其他情况下......也许退后一步,看看我的建议是否会为您的设计增加值(value)!

关于java - 我应该测试什么都不会发生的案例吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com