Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

  54 Lượt xem

Sử dụng Mockito trong Kotlin: Hãy sử dụng mockito-kotlin

MockitoMockito-Kotlin

Trong bài viết này, chúng ta sẽ không đề cập đến cách sử dụng Mockito chính nó, hãy lưu ý điều này. Bài viết này chủ yếu tập trung vào việc sử dụng Mockito trong Android.

Vấn đề khi sử dụng trực tiếp và cách giải quyết

Khi sử dụng Mockito trực tiếp trong Kotlin, đoạn mã có thể trở nên như sau:

val sharedPreferences = mock(SharedPreferences::class.java)
val editor = mock(SharedPreferences.Editor::class.java, RETURNS_DEEP_STUBS)

`when`(sharedPreferences.edit()).thenReturn(editor)
`when`(editor.commit()).thenReturn(true)
`when`(editor.putString(anyString(), anyString())).thenReturn(editor)

Đoạn mã trên là để mock SharedPreferences trong Android. Điều này tạo một đối tượng Editor được mock khi gọi sharedPreferences.edit(), và cho phép sử dụng commit()putString().

Một vấn đề xảy ra là việc sử dụng từ khóa when là không dễ đọc, vì trong Kotlin, từ khóa when là một từ khóa dành riêng. Do đó, cần phải sử dụng dấu ngoặc đơn để tránh lỗi.

Mặc dù điều này không gây ra vấn đề, nhưng để làm cho đoạn mã trở nên “Kotlin hơn”, chúng ta có thể sử dụng thư viện mockito-kotlin (mockito-kotlin).

Môi trường

Thêm thư viện

Thêm thư viện vào project thông qua Gradle hoặc Maven, tùy thuộc vào cách bạn quản lý dependencies.

// testImplementation tùy thuộc vào cấu hình của bạn
testImplementation "com.nhaarman:mockito-kotlin:1.5.0"

Cách sử dụng

Tạo đối tượng mock

Thay vì truyền một lớp nhưng hãy sử dụng generics để xác định lớp đó.

val sharedPreferences = mock<SharedPreferences> {}

Các tùy chọn mà bạn truyền vào là các tham số cho các phương thức, chúng sẽ được sử dụng tương tự như bạn đã thấy trước đó.

val editor = mock<SharedPreferences.Editor>(defaultAnswer = RETURNS_DEEP_STUBS) { }

Tất cả nội dung của withSettings() cũng có thể được truyền vào thông qua các tham số.

// Các tham số có thể sử dụng (tính đến thời điểm 1.5.0)
extraInterfaces: Array<KClass<out Any>>? = null
name: String? = null
spiedInstance: Any? = null
defaultAnswer: Answer<Any>? = null
serializable: Boolean = false
serializableMode: SerializableMode? = null
verboseLogging: Boolean = false
invocationListeners: Array<InvocationListener>? = null
stubOnly: Boolean = false
useConstructor: Boolean = false
outerInstance: Any? = null
stubbing: KStubbing<T>.(T) -> Unit

Xác định hành vi của đối tượng mock

Không sử dụng when mà thay vào đó sử dụng phần nội dung trong lambda của hàm tạo mock.

val editor = mock<SharedPreferences.Editor>(defaultAnswer = RETURNS_DEEP_STUBS) {
    on { commit() } doReturn true
    on { putString(anyString(), anyString()) } doReturn it
}
val sharedPreferences = mock<SharedPreferences> {
    on { edit() } doReturn editor
}

Đoạn mã trên tương đương với đoạn mã Mockito gốc mà bạn đã thấy ở trên.

doReturn

Các giá trị được kế tiếp được sử dụng làm giá trị trả về cho phương thức được mock.
Nếu giá trị trả về là void hoặc Unit, chỉ cần trả về Unit là đủ.

val stringMock = mock<String> {
    on { toString() } doReturn "mocked"
}
stringMock.toString() // => "mocked"

doAnswer

Nhận đối tượng mock như một tham số và trả về một hàm định dạng kiểu giá trị mà phương thức sẽ trả về.
Giống như let.

val stringMock = mock<String> {
    on { toString() } doAnswer { "mocked" + it.hashCode() }
}
stringMock.toString() // => "mocked[Number]"

doThrow

Ném một ngoại lệ cụ thể.

val stringMock = mock<String> {
    on { toString() } doThrow RuntimeException()
}
stringMock.toString() // => RuntimeException

Kết luận

Trong phần xác định đối số của phương thức mock, bạn có thể sử dụng any() hoặc argThat() giống như trong Mockito, vì vậy về cơ bản, bạn không gặp khó khăn gì nếu đã quen với việc sử dụng Mockito. Để biết thêm về cách sử dụng và các phong cách khác, bạn có thể kiểm tra Wiki trên GitHub hoặc xem mã nguồn kiểm thử.

dev_pro_it
Đang làm IT tại Japan

Bình luận

Bài viết chưa có bình luận. Hãy trở thành người bình luận đầu tiên!
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic