在JUnit测试中使用常量或字段

时间:2016-02-25 17:11:08

标签: java junit

在编写单元测试时,我一直在遇到同样的问题。请考虑以下类:

class Dog {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

public class MyTest {

    private static final Dog DOG = createDog();
    private static final String DOG_NAME = "rex";
    private static final int DOG_AGE = 3;

    private static Dog createDog() {
        Dog dog = new Dog();
        dog.setName(DOG_NAME);
        dog.setAge(DOG_AGE);
        return dog;
    }

    @Test
    public void testName() throws Exception {
        SomeObject outcome = classUnderTest.doSomething(DOG);

        assertThat(outcome.getName(), is(DOG_NAME));
        assertThat(outcome.getAge(), is(DOG_AGE));
    }

}

public class MyTest2 {

    private static final String DOG_NAME = "rex";
    private static final int DOG_AGE = 3;

    private Dog dog;

    @Before
    public void setUp() {
        dog = createDog();
    }

    @Test
    public void testName() throws Exception {
        SomeObject outcome = classUnderTest.doSomething(DOG);

        assertThat(outcome.getName(), is(DOG_NAME));
        assertThat(outcome.getAge(), is(DOG_AGE));
    }

    private Dog createDog() {
        Dog dog = new Dog();
        dog.setName(DOG_NAME);
        dog.setAge(DOG_AGE);
        return dog;
    }

}

将狗作为常数还是田地更好?如果这个问题只是基于意见,我会关闭它。

1 个答案:

答案 0 :(得分:2)

这是运行测试时的常见模式......您需要数据!有几个选项

使用测试数据生成器模式的想法是引用并提供与测试相关的显式信息。

由于您正在使用Java,因此有一个名为Make It Easy的小框架可以简化这些构建器的创建......并且还有一个intellij插件可以自动生成建设者使用简单,只需一个快捷方式,你就可以完成所有设置。

现在,回答你的问题:这种模式的结果是,你很少需要在测试中将数据作为常量。您希望尽可能明确地进行测试,而不是添加间接层...所以答案既不是常量也不是字段,而是测试本身的局部变量。