Junit的 - 运行设置方法一次(Junit - run set up method once)

2019-06-17 20:01发布

我建立了一个类与一对夫妇的测试,而不是使用@Before我想有所有测试之前只执行一次设置方法。 这是可能使用JUnit 4.8?

Answer 1:

虽然我与@assylias同意使用@BeforeClass是一个典型的解决方案并不总是方便。 带注释的方法@BeforeClass必须是静态的。 这是一些测试需要测试案例实例非常不方便。 例如基于弹簧的使用测试@Autowired与Spring上下文定义的服务工作。

在这种情况下,我个人使用常规setUp()标注有方法@Before注释和管理我的自定义static (!) boolean标志:

private static boolean setUpIsDone = false;
.....
public void setUp() {
    if (setUpIsDone) {
        return;
    }
    // do the setup
    setUpIsDone = true;
}


Answer 2:

您可以使用该BeforeClass注释 :

@BeforeClass
public static void setUpClass() {
    //executed only once, before the first test
}


Answer 3:

JUnit的5现在有一个@BeforeAll注释:

表示该注释的方法应该在当前类或类层次所有@Test方法之前被执行; 类似于JUnit 4的@BeforeClass。 这样的方法必须是静态的。

JUnit的5的生命周期注解似乎终于得到了它的权利! 你能猜到这看也不看注解可用(例如@BeforeEach @AfterAll)



Answer 4:

setUp()是在测试类的父类,接受的答案可以作如下修改:

public abstract class AbstractTestBase {
    private static Class<? extends AbstractTestBase> testClass;
    .....
    public void setUp() {
        if (this.getClass().equals(testClass)) {
            return;
        }

        // do the setup - once per concrete test class
        .....
        testClass = this.getClass();
    }
}

这应该适用于一个单一的非静态setUp()方法,但我无法产生一个相当于tearDown()不误入复反射的世界......赏金点的人谁可以!



Answer 5:

编辑:我刚刚发现这是在调试类是每次测试之前实例化了。 我猜@BeforeClass注释是这里最好的。

您可以设置在构造过,测试类毕竟一个类。 我不知道这是否是一种不好的做法,因为几乎所有的其他方法进行注释,但它的作品。 您可以创建这样一个构造函数:

public UT () {
    // initialize once here
}
@Test
// Some test here...

该构造函数将在测试之前,因为它们不是静态的调用。



Answer 6:

尝试这种解决方案: https://stackoverflow.com/a/46274919/907576 :

@BeforeAllMethods / @AfterAllMethods注释,你可以在一个实例方面,所有注射值都可以执行在测试类中的任何方法。



Answer 7:

我肮脏的解决方案是:

public class TestCaseExtended extends TestCase {

    private boolean isInitialized = false;
    private int serId;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        if(!isInitialized) {
            loadSaveNewSerId();
            emptyTestResultsDirectory();
            isInitialized = true;
        }
    }

   ...

}

我用它作为基地基地,我所有的测试用例。



Answer 8:

如果你不希望强制将设置并在每个分测验检查变量的声明,然后添加这一个SuperTest可以这样做:

public abstract class SuperTest {

    private static final ConcurrentHashMap<Class, Boolean> INITIALIZED = new ConcurrentHashMap<>();
    protected final boolean initialized() {
        final boolean[] absent = {false};
        INITIALIZED.computeIfAbsent(this.getClass(), (klass)-> {
            return absent[0] = true;
        });
        return !absent[0];
    }
}



public class SubTest extends SuperTest {
    @Before
    public void before() {
        if ( super.initialized() ) return;

         ... magic ... 
    }

}


文章来源: Junit - run set up method once
标签: java junit