@BeforeClass和@AfterClass在每次测试之前和之后调用

时间:2017-11-04 00:34:23

标签: java android junit junit4 android-espresso

我有一个非常简单的测试类,用于在Android上运行espresso测试,如下所示:

import android.util.Log;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.ExternalResource;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.io.IOException;

@RunWith(JUnit4.class)
public class Wtf {

    private static class TestResources extends ExternalResource {
        protected void before() {
            println("before() TestResources");
        }
        protected void after() {
            println("after() TestResources");
        }
    }

    @ClassRule
    public static final TestResources res = new TestResources();

    @BeforeClass
    public static void setUpClass() {
        println("@BeforeClass setUpClass()");
    }

    @AfterClass
    public static void tearDownClass() throws IOException {
        println("@AfterClass tearDownClass()");
    }

    private static void println(String string) {
        Log.d("wow", Wtf.class.getSimpleName() + ": " + string);
    }

    @Before
    public void setUp() {
        this.println("@Before setUp()");
    }

    @After
    public void tearDown() throws IOException {
        this.println("@After tearDown()");
    }

    @Test
    public void test_1() {
        this.println("@Test test1()");
    }

    @Test
    public void test_2() {
        this.println("@Test test2()");
    }
}

输出如下:

D/wow: Wtf: before() TestResources
D/wow: Wtf: @BeforeClass setUpClass()
D/wow: Wtf: @Before setUp()
D/wow: Wtf: @Test test1()
D/wow: Wtf: @After tearDown()
D/wow: Wtf: @AfterClass tearDownClass()
D/wow: Wtf: after() TestResources
D/wow: Wtf: before() TestResources
D/wow: Wtf: @BeforeClass setUpClass()
D/wow: Wtf: @Before setUp()
D/wow: Wtf: @Test test2()
D/wow: Wtf: @After tearDown()
D/wow: Wtf: @AfterClass tearDownClass()
D/wow: Wtf: after() TestResources

但我希望在整个课程运行后调用一些东西。难道我做错了什么?为什么在每次测试之前和之后调用@BeforeClass和@AfterClass方法?

2 个答案:

答案 0 :(得分:3)

事实证明这是由于Android Test Orchestrator

  

每个测试都在自己的Instrumentation实例中运行。因此,如果您的测试共享应用程序状态,则每次测试后都会从设备的CPU或内存中删除大部分共享状态。

我不知道如何绕过它,但至少现在我知道它为什么会发生。

答案 1 :(得分:0)

我只是尝试在eclipse和@AfterClass中运行你的代码,而@BeforeClass只根据Junit文档运行一次(附带截图)。

Wtf: before() TestResources
Wtf: @BeforeClass setUpClass()
Wtf: @Before setUp()
Wtf: @Test test1()
Wtf: @After tearDown()
Wtf: @Before setUp()
Wtf: @Test test2()
Wtf: @After tearDown()
Wtf: @AfterClass tearDownClass()
Wtf: after() TestResources

enter image description here