代码之家  ›  专栏  ›  技术社区  ›  Dimitri Dewaele

我应该测试枚举吗?

  •  8
  • Dimitri Dewaele  · 技术社区  · 8 年前

    如果您有一个仅包含值的简单枚举。吸气剂可用。

    • 是否应该为此枚举编写单元测试?
    • 测试应该覆盖所有类型名称吗?

    有什么建议吗?

    // ENUM with constructor and methods.
    public enum Planet {
        MERCURY(3.303e+23, 2.4397e6),
        VENUS(4.869e+24, 6.0518e6),
        EARTH(5.976e+24, 6.37814e6),
        MARS(6.421e+23, 3.3972e6),
        JUPITER(1.9e+27, 7.1492e7),
        SATURN(5.688e+26, 6.0268e7),
        URANUS(8.686e+25, 2.5559e7),
        NEPTUNE(1.024e+26, 2.4746e7);
    
        // Members
        private final double mass; // in kilograms
        private final double radius; // in meters
    
        // Constructor
        Planet(double mass, double radius) {
            this.mass = mass;
            this.radius = radius;
        }
    
        // Accessors
        public double getMass() {
            return mass;
        }
    
        public double getRadius() {
            return radius;
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  9
  •   Würgspaß    8 年前

    这不是一个简单的是或否的问题,而是在很大程度上取决于上下文。

    如果此枚举是一个庞大项目的关键部分,该项目有许多程序员,通信结构薄弱,并且您希望确保没有人意外更改此关键部分,那么合理的junit测试可能如下所示:

    public class PlanetTest {
        private final static int NUM_PLANETS = 8;
    
        @Test
        public void testIntegrity() {
            assertEquals(NUM_PLANETS, Planet.values().length);
    
            for (Planet planet : Planet.values()) {
                assertTrue("Wierd: Mass in kg is less than radius in m", 
                    planet.getMass() > planet.getRadius());
                }
            }
        }
    

    编写这个测试用例(在IDE的帮助下)所花的时间甚至比阅读问题所花的时间还要少,并且您可以确保没有行星丢失或损坏了值(每次回归测试运行一次)。

    编写测试代码(在测试驱动开发中)的另一个好处是程序员 之前被迫考虑实施问题 他/她编写实际代码。这可以改进代码的微观设计。即使在这个微不足道的例子中,我也能想到在实施之前需要考虑的问题:

    • 是否应该有一种以英里或公里为单位返回半径的方法?
    • 是否应该有一种以吨为单位返回质量的方法?
    • 出于某些遗留的原因,冥王星应该被视为一颗行星吗?
    • ....