2017-10-03 6 views
0

La couverture de code (Jacoco) dans les tests connectés à Android est un moyen très utile pour déterminer quelles méthodes/fonctions ont besoin d'un TLC. Maintenant que je suis passer à Kotlin sur Java j'ai découvert quelques anomalies que je ne peux pas expliquer, comme ce plan d'écran illustre: enter image description hereAnomalies de la couverture du code Android (Kotlin)

Les méthodes commençant par $ _ ... sont internes à Kotlin ou Android, je soupçonne fortement . Mes questions sont: 1) Quelqu'un at-il un aperçu de la raison pour laquelle ces méthodes sont incluses dans le rapport de couverture de code Jacoco, et 2) est-il un moyen de les exclure?

Répondre

1

Ces méthodes sont ajoutées lors de l'utilisation des propriétés synthétiques via Kotlin Android Extensions. Chaque activité de Kotlin utilisant des propriétés synthétiques aura ces méthodes ajoutées.

Kotlin Android Extensions est un plugin pour le compilateur Kotlin, et il fait deux choses:

Ajoute une fonction de mise en cache cachée et un champ intérieur de chaque activité Kotlin. La méthode est assez petite donc elle n'augmente pas beaucoup la taille de l'APK.

Remplace chaque appel de propriété synthétique par un appel de fonction.

Explication sur les documents officiels:

https://kotlinlang.org/docs/tutorials/android-plugin.html#under-the-hood

Ce articles fait un assez bon travail va dans le détail:

https://antonioleiva.com/kotlin-android-extensions/

+1

@ pajato0 voir aussi https://youtrack.jetbrains.com/issue/KT-18714 – Godin

+0

Bonne réponse mais mes deux questions sont toujours ouvertes: 1) si ce sont des fonctions "cachées", pourquoi ne sont-elles pas cachées à Jacoco? ? 2) existe-t-il un moyen d'exclure ces fonctions ou de les invoquer dans le cadre d'un test? Une solution à la deuxième question serait préférable. – pajato0

+0

@godin votre lien est très apprécié. – pajato0

0

En grande partie en raison de la réponse de @ triade, j'ai été capable de trouver une solution qui contourne ce qui semble être un bug de Kotlin. Le work-around a été documenté dans le post Antonio Leiva référencé par @triad. En un mot, la solution consistait à désactiver la mise en cache dans MainActivity. La solution complète est up on GitHub.

Ce que je ne comprends pas complètement est le coût de cette solution, donc je vais attendre de vérifier cette réponse dans l'espoir qu'une meilleure solution est fournie.