Как я могу ожидать ошибки в моем тесте инструментовки Android с использованием FragmentScenario? - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу проверить, произошла ли ошибка в точке onViewCreated фрагмента.

import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import java.lang.IllegalStateException

class TestFragment : Fragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    throw IllegalStateException()
}
}

Запустить вышеуказанный фрагмент с помощью FragmentScenario и проверить try-catch, чтобы увидеть, получаю ли я нужную ошибку.

@Test
fun errorTest() {
    try {
        launchFragmentInContainer<TestFragment>()
        throw Exception("Error Not Catch!")
    } catch (e: IllegalStateException) {

    } catch (e: RuntimeException) {
    }
}

Однако этот код не улавливает ошибку и оставляет следующий журнал:

java.lang.IllegalStateException
at com.my.pkg.TestFragment.onViewCreated(TestFragment.kt:22)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:298)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1232)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1398)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1476)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1541)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2858)
at androidx.fragment.app.FragmentManager.dispatchPause(FragmentManager.java:2828)
at androidx.fragment.app.FragmentController.dispatchPause(FragmentController.java:280)
at androidx.fragment.app.FragmentActivity.onPause(FragmentActivity.java:419)
at android.app.Activity.performPause(Activity.java:7153)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1408)
at androidx.test.runner.MonitoringInstrumentation.callActivityOnPause(MonitoringInstrumentation.java:740)
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3901)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3878)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3852)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3826)
at android.app.ActivityThread.-wrap15(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal .os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:807)

Если я указываю ожидаемое исключение в аннотации теста (@Test (Ожидаемый =IllegalStateException :: class)), журнал отличается, но в любом случае он снова не работает.

java.lang.AssertionError: Expected exception: java.lang.IllegalStateException
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2075)

Я никак не мог сделать этот тест успешным.

1 Ответ

0 голосов
/ 05 ноября 2019

Вы можете аннотировать тест с ожидаемым исключением и fail() тест, если исключение не вызвано.

@Test(expected = NoActivityResumedException::class)
fun backPress_from_first_item_Exits() {
    onView(withText(R.string.app_name)).check(matches(isDisplayed()))

    // throws NoActivityResumedException
    Espresso.pressBack()

    // test should fail if the app is still open
    fail()
}

В моем примере системы backPress закроют приложение и сгенерируют исключение NoActivityResumedException.

...