لدي تطبيق Android مكتوب بنسبة 100 ٪ في Kotlin.
في صفي اختبار الوحدة ، لدي مراقبون اختبار ، أحدهما يراقب الأعداد الصحيحة ، والآخر - كائنات:
val conversationCountObserver: TestObserver<Int>
val conversationObserver: TestObserver<Conversation>
لكل واحد أريد القيام ببعض التأكيدات الأساسية ، مثل التحقق من عدم وجود أخطاء والتحقق من القيم التي تمت ملاحظتها. أقرر كتابة طريقة عامة يمكنها إجراء عدد من التأكيدات على قائمة العناصر في فئة RX TestObserver ، وطريقتين وكيلتين لتمرير المراقب المقابل ومجموعة متنوعة من القيم عبر عامل انتشار Kotlin *:
private fun thenConversationsNotified(vararg conversations: Conversation) {
thenTestObserverNotified(conversationObserver, *conversations)
}
private fun thenConversationCountNotified(vararg counts: Int) {
thenTestObserverNotified(conversationCountObserver, *counts)
}
private fun <T>thenTestObserverNotified(observer: TestObserver<T>, vararg elements: T) {
observer.assertNoErrors()
elements.forEachIndexed { index, element ->
observer.assertValueAt(index, element)
}
}
تعمل طريقة thenConversationsNotified () على ما يرام ، إلا أن طريقة thenConversationCountNotified () تُظهر خطأ:
بعد قراءة مستندات Kotlin ( http://kotlinlang.org/docs/reference/java-interop.html#java-arrays ) أدركت أن مجموعة متنوعة من الأنواع البدائية تخلق في الواقع كائن IntArray بدلاً من Array ، وقد تم ذلك على أنه حل Java interop ، الذي يعالج اختلافات الأوليات بشكل مختلف عن الكائنات. لذلك ، يجب أن أعيد كتابة ثم التحويل إلى إعلام باستخدام totoTypedArray ():
private fun thenConversationCountNotified(vararg counts: Int) {
thenTestObserverNotified(conversationCountObserver, *counts.toTypedArray())
}
لماذا لا يعمل عامل الانتشار على فئة صفيف بدائية بنفس الطريقة التي تعمل بها على صفيف من الكائنات؟ هل هناك طريقة لإزالة المكالمة إلى. toTypedArray () هنا؟
ملاحظة: في الرابط أعلاه ، يعلنون عن intArrayOf (1،2،3) الذي يعيد IntArray ، وعند تمريره إلى الطريقة الأخرى ، يعمل عامل الانتشار بشكل جيد. لذلك يعمل عامل الانتشار مع فئة IntArray. الفرق الوحيد بين مثال في مستندات Kotlin وأسلوبي هو أن لدي معلمتين في طريقة ، واحدة ملموسة وأخرى vararg.