应该在这样的声明中初始化类字段吗?
public class SomeTest extends TestCase
{
    private final List list = new ArrayList();
    public void testPopulateList()
    {
        // Add stuff to the list
        // Assert the list contains what I expect
    }
}或者在setUp()中是这样的?
public class SomeTest extends TestCase
{
    private List list;
    @Override
    protected void setUp() throws Exception
    {
        super.setUp();
        this.list = new ArrayList();
    }
    public void testPopulateList()
    {
        // Add stuff to the list
        // Assert the list contains what I expect
    }
}我倾向于使用第一种形式,因为它更简洁,并允许我使用最后的字段。如果我不需要为设置使用setUp()方法,我是否应该继续使用它,为什么?
Clarification: JUnit将为每个测试方法实例化测试类一次。这意味着list将在每个测试中创建一次,不管我在哪里声明它。这也意味着测试之间不存在时间依赖关系。因此,使用setUp()似乎没有好处。但是,JUnit常见问题中有许多在setUp()中初始化空集合的示例,因此我认为一定有原因。
发布于 2009-02-08 17:39:24
如果您特别想知道JUnit常见问题中的示例(如基本测试模板 ),我认为这里展示的最佳实践是在setUp方法(或测试方法中)中实例化被测试的类。
当JUnit示例在setUp方法中创建ArrayList时,它们都会继续测试该ArrayList的行为,比如testIndexOutOfBoundException、testEmptyCollection等。这里的观点是有人写了一个类,并确保它正常工作。
在测试自己的类时,您可能也应该这样做:在setUp或测试方法中创建对象,以便在以后中断时能够得到合理的输出。
另一方面,如果在测试代码中使用Java集合类(或其他库类),可能不是因为您想测试它--它只是测试夹具的一部分。在这种情况下,您可以安全地假设它按预期工作,所以在声明中初始化它不会有问题。
值得的是,我在一个相当大的、几年前开发的TDD代码库上工作。我们习惯于在测试代码中初始化它们的声明,在我参与这个项目的一年半时间里,它从未引起任何问题。因此,至少有一些轶事证据表明,这样做是合理的。
发布于 2009-02-04 17:53:08
我开始挖掘自己,我发现了使用setUp()的一个潜在优势。如果在执行setUp()期间抛出任何异常,JUnit将打印一个非常有用的堆栈跟踪。另一方面,如果在对象构造过程中抛出异常,错误消息只会说JUnit无法实例化测试用例,并且您看不到发生故障的行号,这可能是因为JUnit使用反射来实例化测试类。
所有这些都不适用于创建空集合的示例,因为这不会抛出,但这是setUp()方法的一个优点。
发布于 2009-02-04 17:22:26
除了亚历克斯·B的答案。
甚至需要使用setUp方法在特定状态下实例化资源。在构造函数中这样做不仅是时间问题,而且由于JUnit运行测试的方式,每个测试状态在运行一个测试之后都会被擦除。
JUnit首先为每个测试方法创建testClass实例,并在创建每个实例之后开始运行测试。在运行测试方法之前,将运行其设置方法,在该方法中可以准备某些状态。
如果要在构造函数中创建数据库状态,则所有实例都将在运行每个测试之前彼此实例化db状态。在第二个测试中,测试将以脏状态运行。
JUnits生命周期:
在使用两个测试方法的测试中使用一些日志:(数字是哈希代码)
https://stackoverflow.com/questions/512184
复制相似问题