当前位置: 首页 > 面试题库 >

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

姬裕
2023-03-14
问题内容

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

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()方法进行设置,是否仍应使用它,为什么?

澄清:
JUnit将每个测试方法实例化一次测试类。这意味着list无论我在哪里声明,每次测试都会创建一次。这也意味着测试之间没有时间依赖性。因此,使用setUp()似乎没有任何优势。但是,JUnit
FAQ中有许多示例可以在setUp()中初始化一个空集合,因此我认为一定有原因。


问题答案:

如果您特别想知道JUnit
FAQ中的示例,例如基本测试模板,我认为展示的最佳实践是应该在setUp方法(或测试方法)中实例
被测类。

当JUnit示例在setUp方法中创建ArrayList时,它们都将继续测试ArrayList的行为,并使用诸如testIndexOutOfBoundException,testEmptyCollection之类的情况。那里的观点是有人编写课程并确保其正常工作。

在测试自己的类时,您可能应该做同样的事情:在setUp或测试方法中创建对象,以便稍后将其破坏时可以获得合理的输出。

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

对于它的价值,我使用的是一个相当大的,由TDD开发的,已有几年历史的代码库。我们习惯性地在测试代码中的声明中初始化事物,而在我从事该项目的一年半中,它从未引起任何问题。因此,至少有一些轶事证据表明这样做是合理的。



 类似资料:
  • 问题内容: 我最近一直在用C#和Java进行编程,并且很好奇初始化我的类字段的最佳位置。 我应该在申报时这样做吗: 还是在构造函数中?: 我真的很好奇你们中的一些资深人士认为这是最佳做法。我要保持一致,并坚持一种方法。 问题答案: 我的规则: 不要在声明中的默认值初始化()。 如果你没有用于更改字段值的构造函数参数,则最好在声明中进行初始化。 如果字段的值由于构造函数参数而改变,则将初始化放入构造

  • 问题内容: 我的应用程序中声明了一堆Angular模块。我最初开始使用“链式”语法声明它们,如下所示: 但是我认为这不太容易阅读,所以我开始使用如下模块变量来声明它们: 第二种语法对我来说似乎更具可读性,但我唯一的抱怨是该语法将变量保留在全局范围之外。如果我有其他名为的变量,它将被下一个变量覆盖(以及与全局变量相关的其他问题)。 所以我的问题是,这是最好的方法吗?还是做这样的事会更好? 还是足够重

  • 问题内容: 通过以下代码,我尝试定义一个简单的模型类,它是可失败的初始化器,它将(json-)字典作为参数。如果用户名未在原始json中定义,则初始化程序应返回。 1.代码为什么不编译?错误消息显示: 从初始化器返回nil之前,必须初始化类实例的所有存储属性。 那没有道理。为什么计划返回时初始化那些属性? 2.我的方法正确吗?或者是否有其他想法或通用模式可以实现我的目标? 问题答案: 更新: 从S

  • 7.1.1 概念 数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。数组的编译时值初始化是按照数组顺序完成的(如下)。 注意事项 如果我们想让数组元素类型为任意类型的话

  • 8.1.1 概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype var map1 map[string]int ([keytype] 和 valuetype 之间允许有空格,但是 gofmt 移除了空格) 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。 未初始化的 map 的值是 nil。 key 可以是任意可以用 ==

  • 这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们