首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最佳实践:在JUnit ()或声明中初始化setUp类字段?

最佳实践:在JUnit ()或声明中初始化setUp类字段?
EN

Stack Overflow用户
提问于 2009-02-04 16:44:06
回答 9查看 169.8K关注 0票数 137

应该在这样的声明中初始化类字段吗?

代码语言:javascript
运行
复制
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()中是这样的?

代码语言:javascript
运行
复制
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()中初始化空集合的示例,因此我认为一定有原因。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-08 17:39:24

如果您特别想知道JUnit常见问题中的示例(如基本测试模板 ),我认为这里展示的最佳实践是在setUp方法(或测试方法中)中实例化被测试的类。

当JUnit示例在setUp方法中创建ArrayList时,它们都会继续测试该ArrayList的行为,比如testIndexOutOfBoundException、testEmptyCollection等。这里的观点是有人写了一个类,并确保它正常工作。

在测试自己的类时,您可能也应该这样做:在setUp或测试方法中创建对象,以便在以后中断时能够得到合理的输出。

另一方面,如果在测试代码中使用Java集合类(或其他库类),可能不是因为您想测试它--它只是测试夹具的一部分。在这种情况下,您可以安全地假设它按预期工作,所以在声明中初始化它不会有问题。

值得的是,我在一个相当大的、几年前开发的TDD代码库上工作。我们习惯于在测试代码中初始化它们的声明,在我参与这个项目的一年半时间里,它从未引起任何问题。因此,至少有一些轶事证据表明,这样做是合理的。

票数 107
EN

Stack Overflow用户

发布于 2009-02-04 17:53:08

我开始挖掘自己,我发现了使用setUp()的一个潜在优势。如果在执行setUp()期间抛出任何异常,JUnit将打印一个非常有用的堆栈跟踪。另一方面,如果在对象构造过程中抛出异常,错误消息只会说JUnit无法实例化测试用例,并且您看不到发生故障的行号,这可能是因为JUnit使用反射来实例化测试类。

所有这些都不适用于创建空集合的示例,因为这不会抛出,但这是setUp()方法的一个优点。

票数 50
EN

Stack Overflow用户

发布于 2009-02-04 17:22:26

除了亚历克斯·B的答案。

甚至需要使用setUp方法在特定状态下实例化资源。在构造函数中这样做不仅是时间问题,而且由于JUnit运行测试的方式,每个测试状态在运行一个测试之后都会被擦除。

JUnit首先为每个测试方法创建testClass实例,并在创建每个实例之后开始运行测试。在运行测试方法之前,将运行其设置方法,在该方法中可以准备某些状态。

如果要在构造函数中创建数据库状态,则所有实例都将在运行每个测试之前彼此实例化db状态。在第二个测试中,测试将以脏状态运行。

JUnits生命周期:

  1. 为每个测试方法创建不同的测试类实例
  2. 对每个testclass实例重复:调用安装程序+调用testmethod

在使用两个测试方法的测试中使用一些日志:(数字是哈希代码)

  • 创建新实例: 5718203
  • 创建新实例: 5947506
  • 设置: 5718203
  • TestOne: 5718203
  • 设置: 5947506
  • TestTwo: 5947506
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/512184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档