【问题标题】:@BeforeClass and @AfterClass called before and after each test@BeforeClass 和 @AfterClass 在每次测试之前和之后调用
【发布时间】:2017-11-04 00:34:23
【问题描述】:

我有一个非常简单的测试类,用于在 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 方法?

【问题讨论】:

  • BeforeClass 每个类只执行一次。我相信您的测试有两个不同的课程
  • 我也是这么想的,但Wtf 是我唯一的测试班,所以我很困惑。也许这与从 Android Studio 执行测试的方式有关?
  • 一些无关的东西:你不必使用@RunWith(JUnit4.class)

标签: java android junit junit4 android-espresso


【解决方案1】:

原来这是由于Android Test Orchestrator:

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

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

【讨论】:

    【解决方案2】:

    我只是尝试在 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
    

    【讨论】:

    • 感谢您尝试使用不同的机器!这就是我所期待的输出。至少现在我知道我没有疯,一定是我的构建设置中有什么东西在做一些奇怪的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2016-01-01
    • 2013-05-04
    • 2016-08-15
    • 2017-02-11
    • 2017-02-14
    • 2016-01-07
    相关资源
    最近更新 更多