java - @parameters方法在@beforeclass方法之前执行

标签 java junit junit4

我正在使用 junit 4 的“参数化”功能,我注意到 @parameters 方法在 @beforeclass 方法之前执行。这给我带来了一个问题,因为我通过 @parameters 传递给测试用例的参数取决于 @beforeclass 方法中的代码初始化。例如

@RunWith(Parameterized.class)
public class TestOtherClass {

    String argument;
    private static boolean initializeThis;

    public TestOtherClass(String parameter) throws Exception {
        argument=parameter;
    }

    @BeforeClass
    public static void doSetup() {
        System.out.println("Doing setup before class...");
        initializeThis=true; // true or false, based on some condition
    }

    @Test
    public void otherTest() {
        System.out.println("Other test: " + argument);
    }

    @Parameters
    public static Collection<Object[]> getData(){
        System.out.println("Inside parameter");
        String addThis;
        if(initializeThis)
            addThis="adding true";
        else
            addThis="adding false";

        Object[] para1 = new Object[]{"First parameter :: " + addThis};
        Object[] para2 = new Object[]{"Second parameter :: " + addThis};

        Collection<Object[]> classNames = new ArrayList<Object[]>();
        classNames.add(para1);
        classNames.add(para2);
        return classNames;
    }
}

现在,我在 @beforeclass 方法中将变量“initializeThis”初始化为 true,但是(令人惊讶的是)当我执行测试用例时,它会打印

Other test: First parameter :: adding false
Other test: Second parameter :: adding false

这是出乎意料的。
我的问题是;有没有办法在@parameters之前执行@beforeclass方法,我们可以在junit 4中这样做吗?

最佳答案

我会使用普通的旧 java static {..} 初始化程序而不是 @BeforeClass,例如:

@RunWith(Parameterized.class)
public class TestOtherClass {

    String argument;
    private static boolean initializeThis;

    public TestOtherClass(String parameter) throws Exception {
        argument=parameter;
    }

    static {
        doSetup();
    }

    // @BeforeClass
    public static void doSetup() {
        System.out.println("Doing setup before class...");
        initializeThis=true; // true or false, based on some condition
    }

    @Test
    public void otherTest() {
        System.out.println("Other test: " + argument);
    }

    @Parameters
    public static Collection<Object[]> getData(){
        System.out.println("Inside parameter");
        String addThis;
        if(initializeThis)
            addThis="adding true";
        else
            addThis="adding false";

        Object[] para1 = new Object[]{"First parameter :: " + addThis};
        Object[] para2 = new Object[]{"Second parameter :: " + addThis};

        Collection<Object[]> classNames = new ArrayList<Object[]>();
        classNames.add(para1);
        classNames.add(para2);
        return classNames;
    }
}

我知道的唯一缺点是从中继承的类将无法覆盖静态初始化程序,而 @BeforeClass 在这方面提供了一些自由;

关于java - @parameters方法在@beforeclass方法之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862315/

相关文章:

java - 无法在 Mac 的 Eclipse 中加载 SWT 库

Java-ThreadLocal 与 ConcurrentHashMap

java - Spring Boot 1.4.2,hibernate 5.2.3,版本库的Junit Test,@DataJpaTest Issue,版本冲突?

java - 我该如何测试这个?

java - 错误的 junit 测试名称

java - Spring @Transactional on @Bean 声明而不是类实现

java - 如何使用 Java 从目录中获取最后修改的 10 个文件?

java - 如何在运行 junit 测试用例时避免实际的方法调用

maven - 在 Spring Junit 测试用例中获取 jdbcTemplate null

junit4 - 肯定会忽略并行线程计数(JUnit 4)