Я работаю над проектом 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)
Что не так с моим кодом и как я могу это исправить?