确保在JUnit测试中调用所有getter方法

时间:2010-04-01 18:14:57

标签: java testing reflection junit

我有一个使用XStream的类,并用作我的应用程序的传输格式。我正在为其他类编写测试,这些类将这种传输格式映射到不同的消息传递标准。我想确保我的班级中的所有getter都在测试中被调用,以确保如果添加了一个新字段,我的测试会正确地检查它。

XStream类的大致轮廓

@XStreamAlias("thing")
public class Thing implements Serializable {
 private int id;
 private int someField;

 public int getId(){ ... }
 public int someField() { ... }
}

现在如果我将该类更新为:

@XStreamAlias("thing")
public class Thing implements Serializable {
 private int id;
 private int someField;
 private String newField;

 public int getId(){ ... }
 public int getSomeField() { ... }
 public String getNewField(){ ... }
}

我希望我的测试失败,因为旧的测试没有调用getNewField()

目标是确保如果添加新的getter,我们可以通过某种方式确保测试检查它们。

理想情况下,这将完全包含在测试中,而不需要修改底层的Thing类。

有什么想法吗?谢谢你的期待!

6 个答案:

答案 0 :(得分:5)

可能是您需要的代码覆盖工具。如果您有100%的代码覆盖率,则调用所有get方法。如果您使用的是eclipse,请查看EclEmma插件。

答案 1 :(得分:0)

您可以使用Sonar。我发现它非常有用且易于设置。也很容易与哈德森整合。他们也有一次日食plugin

答案 2 :(得分:0)

如果您想自动测试测试,那么JUnit不是一个好选择。您希望确保在所有其他测试之后始终最后调用您的“特殊测试”吗? (我不是说这是不可能的,但它反对JUnit模型/哲学,说测试用例应该是相互独立的。)

如果您有任何机会决定这样做,其中一种可能性就是生成Cobertura代码覆盖率报告并解析它以查找测试期间是否覆盖了所有的getter。可能还有一种通过某种API与Cobertura进行交互而不依赖于输出报告文件的方法。

算法示例:

  1. 运行常规测试套件
  2. 跑Cobertura
  3. 运行特殊测试用例

答案 3 :(得分:0)

听起来你在谈论元测试 - 测试测试。恕我直言,它没有多大意义。测试是规范。因此测试用例的开发人员应该在添加新字段时更新测试。也就是说,这是一种调用Java bean的所有getter方法的贫民窟方式。

public class GhettoBeanTest {
    private static class Subclass extends SomeObject {
        @Override public String toString() {
            return org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(this);
        }
    }

    @Test public void ensureToStringMethodExecutes() {
        String value = new Subclass().toString();

        // teset passed - all getter methods were executed by the toString method above
    }
}

答案 4 :(得分:0)

考虑Java Bean Tester: http://sourceforge.net/projects/javabeantester/

我们经常使用它。我们喜欢它。

答案 5 :(得分:0)

我写过这样的东西,你可以找到它here。 它会对对象进行代理,以便拦截所有调用,然后再进行检查。