为什么这个 Android Instrumentation Test 调用 activity onCreate 两次?

Why is this Android Instrumentation Test invoking activity onCreate twice?

我有这个测试class:

class InspirationalQuoteInstrumentedTest {

    private lateinit var server: MockWebServer

    @Rule
    @JvmField
    val mActivityRule: ActivityTestRule<InspirationalQuoteActivity> = ActivityTestRule(InspirationalQuoteActivity::class.java)

    @Before
    fun setUp() {
        server = MockWebServer()
        server.start()
        Constants.BASE_URL = server.url("/").toString()
    }

    @After
    fun tearDown() {
        server.shutdown()
    }

    @Test
    fun ensureTheQuoteOfTheDayIsDisplayed() {
        println("Base URL: ${Constants.BASE_URL}")
        Log.e(TAG,"Base URL: ${Constants.BASE_URL}")
        val response200 = this::class.java.classLoader.getResource("200.json").readText()
        val jsonResponse = JSONObject(response200)
        val expectedQuote = jsonResponse
                .getJSONObject("contents")
                .getJSONArray("quotes")
                .getJSONObject(0)
                .getString("quote")
        server.enqueue(MockResponse()
                .setResponseCode(200)
                .setBody(response200))

        val intent = Intent()
        mActivityRule.launchActivity(intent)

        onView(withId(R.id.inspirationalQuote))
                .check(matches(withText(expectedQuote)))
    }

    companion object {
        val TAG = InspirationalQuoteInstrumentedTest::class.java.simpleName
    }
}

我有这个 activity:

class InspirationalQuoteActivity : AppCompatActivity() {

    private lateinit var quoteService: QuoteOfTheDayService
    private var quote: String = ""
    private var author: String = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_inspirational_quote)
        val textView = findViewById<TextView>(R.id.inspirationalQuote) as TextView

        val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
        StrictMode.setThreadPolicy(policy)

        textView.text = getQuoteOfTheDay()
    }

    private fun getQuoteOfTheDay(): String {
        quoteService = QuoteOfTheDayService()
        val qod = quoteService.getQuoteOfTheDay()
        val response = qod.execute()
        Log.e(TAG, "Response: $response")
        response?.let {
            quote = response.body()!!.contents.quotes[0].quote
            author = response.body()!!.contents.quotes[0].author
        }
        Log.e(TAG, "Expected Quote: $quote")
        return quote
    }

    companion object {
        private val TAG = InspirationalQuoteActivity::class.java.simpleName
    }
}

当我 运行 我的测试 getQuoteOfTheDay() 执行了两次。是什么赋予了?问题是我正在尝试模拟一个 api 调用,它看起来像预期的那样工作,但是还有另一个日志,我不确定它来自哪里。作为参考,这是 logcat

中的输出
Response: Response{protocol=http/1.1, code=200, message=OK, url=https://quotes.rest/qod}
Expected Quote: Let us think the unthinkable, let us do the undoable, let us prepare to grapple with the ineffable itself, and see if we may not eff it after all.
Response: Response{protocol=http/1.1, code=200, message=OK, url=http://localhost:37290/qod}
Expected Quote: Winning is nice if you don't lose your integrity in the process.

如您所见,我点击了一次 https://quotes.rest/qod,然后我点击了我的模拟服务器。

我在构造函数中遗漏了一些参数...Doh。

改变

ActivityTestRule(InspirationalQuoteActivity::class.java)

ActivityTestRule(InspirationalQuoteActivity::class.java, false, false)

成功了。

您正在使用 intentTestRule 启动 activity IntentsTestRule<>(InspirationalQuoteActivity.class, false, true);

第三个参数为launchActivity,必须设置为false