单元测试成员变量应该是私有的还是公共的?

hen*_*nes 3 java junit

考虑以下(伪ish)单元测试类.

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class MyTest {

    private static final int MY_CONSTANT = 7;

    private Object object;

    @Before
    public void setUp() throws Exception {
        object = new Object();
    }

    @Test
    public void test1() {
        Assert.assertEquals(MY_CONSTANT, object.property1);
    }

}
Run Code Online (Sandbox Code Playgroud)

我想知道的是,是否有任何最佳实践可以使用哪个访问修饰符用于成员MY_CONSTANTobject.在非测试类中,您显然会尽可能少地暴露类内部并使用private修饰符.但是,在一个看似不重要的单元测试中,我们也可以成为成员public.

那么我使用的访问修饰符是否真的是任意的,或者我错过了什么?

Mur*_*nik 7

这是一个品味和项目标准的问题,但我通常会遵循经验法则,即如果没有充分的理由public(或者protected,就此而言),它应该是private.这可以防止其他测试错误地使用这些成员变量(同样,除非有充分的理由)并且主要有助于为项目提供简化的外观 - 生产代码和测试代码遵循相同的标准.

编辑:
正如@dkatzel在评论中提到的那样(谢谢!)一些由JUnit(或其他类似框架)注释注释的字段必须具有一组特定的修饰符.例如,用注释字段@Rule必须public与注释字段@ClassRule必须是public static(至少从JUnit的4.11.此前4.x的版本都比较松懈的一点static修改).