Jacoco жалуется на маловероятную пропущенную ветку - PullRequest
2 голосов
/ 12 апреля 2020

Я использую Gradle 6.3 и Jacoco для составления, тестирования и отображения отчета о покрытии. Но я не понимаю, почему он жалуется, что "пропущена 1 из 2 веток", ветки вообще нет:

1 of 2 branches missed

Вот полный Kotlin класс данных:

data class ListNode<T>(var value: T, var next: ListNode<T>?) {

    override fun hashCode(): Int = value.hashCode()

}

Если есть какие-то ветви за сценой, что они такое и как их покрыть?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

На самом деле в байт-коде есть две ветви, и вот почему.

Вы используете расширение hashCode() на Any?, поскольку верхняя граница T равна Any?, а не Any. Это расширение реализовано следующим образом:

public inline fun Any?.hashCode(): Int = this?.hashCode() ?: 0

Это означает, что в байт-коде ваш вызов value.hashCode() заменяется на value?.hashCode() ?: 0.

В своем тесте вы охватываете только случай, когда value не равен нулю, вероятно, поэтому ветвь ?: 0 не рассматривается.

У вас есть два решения, пока JaCoCo не будет поддерживать inline функции:

  • охватывает также другую ветвь тестирования ListNode, используя null T.
  • , используя Any в качестве верхней границы T:
data class ListNode<T: Any>(var value: T, var next: ListNode<T>?)
0 голосов
/ 12 апреля 2020

A data class в Kotlin имеет автоматически генерируемые методы (equals, toString, hashCode, геттеры, сеттеры). В данном случае речь идет о equals. Он не виден в коде class ListNode, но его байт-код JVM определенно содержит equals, toString и т. Д. c.

Jacoco в основном предназначен для Java Co de Co verage, так что эта ситуация, вероятно, может рассматриваться как некорректная обработка сгенерированными методами Jacoco в Kotlin. Если вы sh - фиксируете проблему для сопровождающих проекта.

В любом случае, чтобы избежать предупреждений Jacoco для этого конкретного случая, просто посмотрите код в отчете (строки 17, 18, .. до конца метода equals):

  1. временно скопировать содержимое сгенерированного метода equals в ListNode (только для собственного удобства)

  2. увеличить покрытие кода до необходимого уровня

  3. стереть метод equals

  4. покрытие кода остаются такими же, как на шаге (2), поскольку equals остается тем же (но теперь оно создается неявно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...