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

@BeforeClass and @AfterClass called before and after each test

我有一个非常简单的测试 class 用于 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

但是我想要在整个 class 运行之后调用一些东西。难道我做错了什么?为什么每次测试前后都会调用@BeforeClass 和@AfterClass 方法?

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

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

原来这是由于 Android Test Orchestrator:

Each test runs in its own Instrumentation instance. Therefore, if your tests share app state, most of that shared state is removed from your device's CPU or memory after each test.

我不知道有什么解决办法,但至少现在我知道为什么会这样了。