Android Kotlin: Mockito верифицирует ошибку при создании метода Попытка вызвать виртуальный метод 'int java .lang.Number.intValue ()' для ссылки на пустой объект - PullRequest
0 голосов
/ 08 марта 2020

Я работаю над проектом Android, используя Kotlin. Я пишу тесты для моего приложения. Я использую Mockito для имитации объектов и проверки того, что методы выполняются. Но теперь я получаю сообщение об ошибке при проверке вызова метода. Ниже приведен мой код.

Я вызываю метод объекта в моей деятельности, как этот

ApplicationController.instance.eventService.uploadMediaFiles(1, ArrayList<File>())

Но этот метод буквально ничего не делает.

I иметь класс Dagger TestAppModule со следующим кодом

@Module
open class TestAppModule (private val app: Application) {
    private var eventService: IEventService = FakeEventService()

    @Singleton
    @Provides
    fun provideContext(): Context = app

    fun injectEventService(eventService: IEventService) {
        this.eventService = eventService
    }

    @Singleton
    @Provides
    open fun eventService(): IEventService {
        return this.eventService
    }
}

Буквально, метод uploadMediaFiles ничего не делает. Я просто проверяю, могу ли я писать тесты, используя метод проверки Mockito.

Это мой тест.

@RunWith(AndroidJUnit4::class)
@LargeTest
class CameraTest: TestBuilder()
{
    @get:Rule var cameraActivityRule: IntentsTestRule<CameraActivity> = IntentsTestRule<CameraActivity>(CameraActivity::class.java, true, false)
    @Mock private lateinit var fileIOServiceMock: IFileIOService
    @Mock private lateinit var eventService: IEventService
    @get:Rule var permissionRule: GrantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.RECORD_AUDIO)
    private var eventModel: EventModel = EventModel(1, "Event", "", "description", "2015-12-12", "2015-12-12", "123", "", "", "", "", "", "", 1.1, 1.1, "UK")

    @Before fun setUp() {
        //this was written to mock the logic for testing camera logic. But there is an issue with testing the CameraView library
        MockitoAnnotations.initMocks(this)
        val instrumentation = InstrumentationRegistry.getInstrumentation()
        val app = instrumentation.targetContext.applicationContext as MockApplicationController
        var testModule = TestAppModule(app)
        testModule.injectFileIOService(this.fileIOServiceMock)
        testModule.injectEventService(this.eventService)
        app.appComponent = DaggerTestAppComponent
            .builder()
            .testAppModule(testModule)
            .build()
        app.appComponent.inject(app)
    }

    @Test fun filesAreUploadedToServerWhenPickedUpFromGallery() {
        this.launchActivityWithIntent()
        val resultData = Intent()
        resultData.putExtra("phone", "123456")
        val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
        intending(IntentMatchers.hasAction(Intent.ACTION_PICK)).respondWith(result)
        onView(withId(R.id.camera_image_btn_gallery)).perform(click())

        Mockito.verify(this.eventService).uploadMediaFiles(any<Int>(), any<ArrayList<File>>())
    }


Mockito.
    //Reference: https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791
    private fun <T> any(): T {
        Mockito.any<T>()
        return uninitialized()
    }
    private fun <T> uninitialized(): T = null as T


    private fun launchActivityWithIntent() {
        var targetContext: Context = InstrumentationRegistry.getInstrumentation().targetContext
        var intent: Intent = Intent(targetContext, CameraActivity::class.java)
        intent.putExtra(CameraActivity.FIELD_EVENT_MODEL, this.eventModel.toJSON())
        this.cameraActivityRule.launchActivity(intent)
    }
}

Когда я запускаю свой тест, я получаю следующую ошибку.

E/TestRunner: failed: filesAreUploadedToServerWhenPickedUpFromGallery(com.example.memento.CameraTest)
    ----- begin exception -----
E/TestRunner: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Number.intValue()' on a null object reference
        at com.example.memento.CameraTest.filesAreUploadedToServerWhenPickedUpFromGallery(CameraTest.kt:280)
        at java.lang.reflect.Method.invoke(Native Method)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
        at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:531)
        at androidx.test.rule.GrantPermissionRule$RequestPermissionStatement.evaluate(GrantPermissionRule.java:134)
        at org.junit.rules.RunRules.evaluate(RunRules.java:20)
        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.runner.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:2145)

Что не так с моим кодом и как я могу это исправить?

...