Почему этот тест инструментария 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
, вы должны установить его как ложное