mockito 在@Before setUp方法中创建(Junit)单元测试中的“新”对象与“清除”或“清空”类/全局级变量?最佳实践?

oipij1gg  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(141)

我想知道,在单元测试中,是不是更好的做法是示例化对象,如Sets、Maps、LinkedLists或Arrays作为类的field,然后在每个**@Test之前运行的@Before方法中清除它们?或者是不是更好的做法是简单地示例化@Before方法中的对象,但将它们声明为类的field*?

1,例如,清除/清空数据结构并重新使用

public class MyUnitTestExample1 {

   // Declare variable as field of class/member variable
   private Set<String> set = new HashSet<>();
   private Map<String, Integer> map = new HashMap<>();

   @Before
    public void setUp() {

       // Data structure should be cleared before each test, but only instantiated 1 time?
       set.clear();
       map.clear();
    }

2,例如,每个测试示例化新对象,但声明为类的字段,以便类中的每个**@测试**都可以访问它

public class MyUnitTestExample2 {

   // Declare variable as field of class/member variable
   private Set<String> set;
   private Map<String, Integer> map;

   @Before
    public void setUp() {

    // Instantiate here
       set = new HashSet<>();
       map = new HashMap<>();
    }

...一个比另一个更好吗?更有效吗?更快吗?我认为清除数据结构的内容并示例化一次(或者我认为它会这样做)更快

cgvd09ve

cgvd09ve1#

清除@BeforeEach中的示例变量没有任何意义- JUnit为每个测试示例化测试类的新示例。

public class MyUnitTestExample1 {

    private Set<String> set = new HashSet<>();

    @Test
    void test1() {
        System.out.println(this);
        System.out.println(System.identityHashCode(set));
    }

    @Test
    void test2() {
        System.out.println(this);
        System.out.println(System.identityHashCode(set));
    }
}

输出量

com.sandbox.MyUnitTestExample1@3857f613
428566321
com.sandbox.MyUnitTestExample1@fa4c865
1004023029
8zzbczxx

8zzbczxx2#

1.我认为在这种情况下,性能并不重要。清除或新建一个HashMap/Set以及通过垃圾收集清除旧对象都应该花费最少的时间。即使有数千个条目,填充Map/Set也比清除它花费更长的时间。
1.你应该更关心的是在单元测试类中使用变量,这些变量对于该类的单元测试是“全局”的。我看不到这样做的好处。我会在每个单元测试中使用一个新的集合/Map来分隔类中的另一个测试。否则,根据测试的执行顺序,你可能会有副作用。过去我遇到过一些奇怪的情况,测试会产生不同的结果,因为开发人员运行在Windows上,而CI服务器运行在Linux上。

相关问题