Почему этот тест инструментария Android дважды вызывает действие onCreate?

У меня есть этот тестовый класс:

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
    }
}

И у меня есть эта деятельность:

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 один раз, а затем я ударил мой фиктивный сервер после этого.

2 ответа

Решение

Я пропустил некоторые аргументы в конструкторе... Doh.

изменения

ActivityTestRule(InspirationalQuoteActivity::class.java)

в

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

сделал трюк.

Вы запускаете свою деятельность с помощью intentTestRule IntentsTestRule<>(InspirationalQuoteActivity.class, false, true);

Третий параметр launchActivity, вы должны установить его как ложное

Другие вопросы по тегам