每次运行测试用例方法时,JUnit都会实例化对象

时间:2013-05-23 12:33:33

标签: java junit junit4

package com.bnpparibas.test;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

import com.bnpparibas.util.PendingUtil;

public class PendingTest {
    PendingUtil pendingUtil = new PendingUtil();
    boolean result;
    @Test
    public void fetchPendingWFFromDB()
    {
        result = pendingUtil.fetchPendingWFFromDB();
        assertTrue(result);
    }
    @Test
    public void runPendingBatch()
    {
        result = pendingUtil.runPendingBatch();
        assertTrue(result);
    }
    @Test
    public void checkQueuePostPendingRun()
    {
        result = pendingUtil.checkQueuePostPendingRun();
        assertTrue(result);
    }
}

以上是我的测试用例

public class PendingUtil {
public PendingUtil() 
    {
    try {
           System.out.println("In Const");
           }
catch (SQLException e) {
        e.printStackTrace();
                     }
    }

上面是我从JUnit测试用例调用的类。

在我的测试用例中,我已经创建了一次对象..

PendingUtil pendingUtil = new PendingUtil();

但内部JUnit调用构造函数三次!! 这是可能的。

5 个答案:

答案 0 :(得分:13)

您已使用@Test注释了3个方法。来自此注释的JUnit API docTo run the method, JUnit first constructs a fresh instance of the class then invokes the annotated method.

简而言之,整个测试类实例化了3次,因此PendingUtil也是如此(每次测试类的后续实例都有一次)。

要执行您想要的操作,请将属性定义保留在原来的位置,但在使用@BeforeClass注释注释的新方法中为其分配PendingUtil实例。

此外,您可以将该属性标记为vikingsteve建议的静态。

答案 1 :(得分:5)

您可以使用pendingUtil方法创建@BeforeClass

答案 2 :(得分:0)

相反,如果您不希望PendingUtil被调用三次,您应该编写一个TestUtil包装器,它可能只是将Factory方法放在new PendingUtil()之前,并且只创建一个实例。

答案 3 :(得分:0)

你可以使pendingUtil静态

static PendingUtil pendingUtil = new PendingUtil();

答案 4 :(得分:0)

嘿,仅用于Junit5更新,

您可以在@BeforeAll方法中创建endingUtil。

或如下所示:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class PendingTest {
}

出于知识的考虑,如果我们需要为每个方法创建新的实例,则可以使用Lifecycle.PER_METHOD。