java - 如何成功地结合这两个 JUnit 测试的逻辑?

标签 java unit-testing junit

我正在为一个相对简单的类编写一些单元测试:

public class Asylum {
    List<Guard> guards = new ArrayList<Guard>();
    List<Inmate> inmates = new ArrayList<Inmate>();

    public void addGuard(Guard g) { //... }
    public void addInmate(Inmate i) { //... }
}

我对这两个函数的单元测试确定了如果我传入 null 值会发生什么:

@Test
public void addGuardNullValue() {
    asylum.addGuard(null);
    assertEquals(0, asylum.getNumGuards());
}

@Test
public void addInmateNullValue() {
    asylum.addInmate(null);
    assertEquals(0, asylum.getNumInmates());
}

我实际上有几个(> 3)个这样的容器,里面装有 guard 、囚犯、典狱长等,但我不想为他们的所有类(class)编写基本上相同的单元测试。

有什么方法可以将其归结为一个单元测试来覆盖n个类吗?

(请注意,我无法为 Guard 和 Inmate 创建总体父类,也无法创建它们都可以实现的接口(interface)。)

最佳答案

我只看到两种解决方案,我也不推荐。

第一个是使用反射。列出类中的所有方法,并选择名称类似于 add*getNum* 的方法。然后,您可以使用 null 值调用 add* 并检查 getNum* 的返回值。问题是方法名称 (addGroup) 中可能出现误报,并且生成的测试将难以读取(和写入)。

第二个解决方案是方法addPerson(PersonType type, Object person),它根据PersonType向下转换person。我发现这是一个糟糕的选择,因为它消除了静态类型检查,增加了不必要的复杂性并且容易进一步滥用。我提到是因为您可能会发现一些有用的变化。

我的最终答案是“不要这样做,不值得”。您将需要更多行,但它们非常易于阅读和编写,并且在第一次尝试时可能不会出现错误。

我想用我认为合适的一句话来结束:

Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. (Brian Kernighan)

关于java - 如何成功地结合这两个 JUnit 测试的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446670/

相关文章:

java - 无法在 JDBC 中执行 MySQL 存储过程,出现空指针异常

java - 如何访问 Java 中的私有(private)类成员?

c# - 测试/验证弱引用

json - 使用Spring的mockMvc,如何检查返回的数据是否包含字符串的一部分?

Android 应用程序模块中 JUnit 测试中的类的 java.lang.ClassNotFoundException

java - Azure Java SDK v12 未异步下载文件

java - 在 Morphia 中向父类(super class)添加 PostLoad 注释

java - 类和私有(private)成员

javascript - 单元测试事件驱动的javascript

java - 在 Struts 2 中运行测试用例时出现错误