3

测试用例:

import static org.junit.Assert.assertTrue; 
import org.junit.Test;
       
        
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);
    }
}

从 JUnit 测试用例调用的类。

public class PendingUtil {

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

在我的测试用例中,我只创建一次对象:

    PendingUtil pendingUtil = new PendingUtil();

但是在内部,JUnit 调用了构造函数 3 次。

为什么会这样?

4

5 回答 5

16

你已经用 . 注释了 3 个方法@Test。来自此注释的JUnit API 文档:To run the method, JUnit first constructs a fresh instance of the class then invokes the annotated method.

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

要执行您想要的操作,请将属性定义保留在原处,但在使用@BeforeClassPendingUtil注释注释的新方法中将实例分配给它。

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

于 2013-05-23T12:38:18.117 回答
5

您可以pendingUtil@BeforeClass方法中创建。

于 2013-05-23T12:40:25.823 回答
0

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

于 2013-05-23T12:38:06.410 回答
0

您可以将 pendingUtil 设为静态

static PendingUtil pendingUtil = new PendingUtil();
于 2013-05-23T12:43:45.340 回答
0

嘿,只是为了更新 Junit5,

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

或如下所示:

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

只是为了知识,如果我们需要为每个方法创建新的实例,我们可以创建 Lifecycle.PER_METHOD。

于 2020-04-30T17:13:26.067 回答