วิธีจำลองคลาสแอปพลิเคชันเพื่อทดสอบหน่วย ViewModel

ฉันมี View Model ที่ขยาย AndroidViewModel

class MoveViewModel(application: Application): AndroidViewModel(application),CoroutineScope{
    ....
}

และฉันต้องการทดสอบหน่วย แต่ฉันไม่สามารถหาวิธีจำลองคลาส Application ได้

@Test
    fun testSearchDataValidation() {
        val application = Mockito.mock(Application::class.java)
        val viewModel = MoveViewModel(application)

        .....
    }

แต่เมื่อฉันไปรันการทดสอบ ฉันได้รับข้อผิดพลาดว่า Mockito ไม่สามารถจำลอง Application ได้

org.mockito.Exceptions.base.MockitoException: Mockito ไม่สามารถจำลองคลาสนี้: คลาส android.app.Application

Mockito สามารถจำลองเฉพาะชั้นเรียนที่ไม่ใช่ส่วนตัวและไม่ใช่ชั้นเรียนสุดท้ายเท่านั้น

ฉันจะจำลองคลาส Application เพื่อส่งผ่านไปยังโมเดลมุมมองของฉันได้อย่างไร

แก้ไข:

นี่คือลำดับชั้นโฟลเดอร์ของฉันตามที่แนะนำโดย @farhanjk

ป้อนคำอธิบายรูปภาพที่นี่


comment
คุณกำลังพยายามเยาะเย้ยคลาส Application ใน AndroidTest ซึ่งไม่สมเหตุสมผลนักเนื่องจากคุณสามารถรับอินสแตนซ์ของ Application จริงได้   -  person lelloman    schedule 10.04.2019
comment
@lelloman ไม่แน่ใจว่าคุณหมายถึงอะไร ฉันคิดว่า androidTest มีไว้สำหรับเมื่อคุณต้องการทำงานกับกรอบงาน Android ViewModel จะใช้การตั้งค่าที่ใช้ร่วมกันบางอย่าง ฉันยังใหม่มากกับการทดสอบหน่วยใน Android ดังนั้นฉันจึงไม่เข้าใจทุกอย่างทั้งหมด แต่ฉันสามารถทำการทดสอบเหล่านี้ในโฟลเดอร์ test ได้หรือไม่   -  person tyczj    schedule 10.04.2019
comment
หากคุณกำลังทดสอบโมเดลมุมมองจริง ๆ คุณควรจะสามารถทำได้ในโฟลเดอร์ test คุณจะต้องจำลองการพึ่งพา Android ทั้งหมด (เช่น Application หรือ SharedPreferences) การทดสอบในโฟลเดอร์ androidTest จะทำให้แอปพลิเคชันจริงของคุณพร้อมใช้งานแทน คุณควรจะสามารถทดสอบหน่วยมุมมองแบบจำลองใน test ได้ ซึ่งเร็วกว่า androidTest มาก   -  person lelloman    schedule 10.04.2019


คำตอบ (1)


Mockito.mock(Application::class.java)

ในโฟลเดอร์ test ของคุณ ให้สร้างลำดับชั้นดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ในไฟล์ org.mockito.plugins.MockMaker ให้ใส่ข้อความบรรทัดเดียว mock-maker-inline

เยาะเย้ยสิ่งที่ไม่สามารถจำลองได้: เลือกใช้การเยาะเย้ยคลาส / วิธีการสุดท้าย

person farhanjk    schedule 09.04.2019
comment
ฉันต้องอัปเดตเวอร์ชัน mockito ของฉัน และมันก็เริ่มทำงานได้ - person tyczj; 10.04.2019