0

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

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) { //... }
}

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

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

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

实际上,我有几个(> 3)这些警卫、囚犯、监狱长等容器,但我宁愿不为他们的所有班级编写基本相同的单元测试。

有什么办法可以把它归结为一个单元测试来覆盖n 个类?

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

4

2 回答 2

3

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

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

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

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

我想以我认为合适的报价结束:

首先,调试的难度是编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您还不够聪明,无法对其进行调试。(布赖恩·克尼根)

于 2013-01-21T21:02:38.663 回答
1

第一的。正确的答案 IMO 来自 BoppreH。不要这样做。

但这是使用反射的方法。
您不妨开始阅读有关反射 API的文档

package sandbox;
......
......
@Test
public void testAddClasses() throws Exception {
    String classesToTest[] = new String[]{"Inmate", "Guard"};
    for (String classToTest : classesToTest){
        String fullClassName = "sandbox." + classToTest;
        String addMethodName = "add" + classToTest;
        String countMethodName = "getNum" + classToTest + "s"; 

        Asylum asylum = new Asylum();

        Class asylumClass = asylum.getClass();
        Class testClass = Class.forName(fullClassName, true, asylumClass.getClassLoader());

        Method addMethod = asylumClass.getDeclaredMethod(addMethodName, testClass);
        Object voidObj = addMethod.invoke(asylum, (Object)null);

        Method countMethod = asylumClass.getDeclaredMethod(countMethodName, null);
        int count = (int) countMethod.invoke(asylum, null);

        assertEquals(0, count);
    }
}
于 2013-01-21T23:17:52.083 回答