2016-06-11 11 views
2

ich den folgenden Konstruktor habe:Jacoco Abdeckung und Kotlin Standardparameter

open class IPFS @JvmOverloads constructor(protected val base_url: String = "http://127.0.0.1:5001/api/v0/", 
              protected val okHttpClient: OkHttpClient = OkHttpClient.Builder().build(), 
              protected val moshi: Moshi = Moshi.Builder().build()) { 

Nun, wenn Berichterstattung Messen ich immer vermisst bekommen für, wenn Standardeinstellungen verwendet. Der einzige Ausweg, den ich mir vorstellen kann, ist, einige Tests in Java zu schreiben, die die anderen Konstruktoren verwenden - aber ich würde gerne in reinem Kotlin bleiben - gibt es eine Möglichkeit, dies zu tun?

enter image description here

Update: Ich bin Konstrukteuren wie IPFS() in meinen Tests mit - aber ich denke, auf der Java-Bytecode erzeugt dies mit allen drei Parametern an den Konstruktor überführt wird - und das ist das einzige, was jacoco sieht

+0

Technisch haben Sie vier Konstruktoren im Byte-Code, und Sie rufen nur einen von ihnen auf. Dies wäre das gleiche wie in Java. – nhaarman

+0

Ich rufe verschiedene Konstruktoren - aber nur eine wird von Jacoco gesehen – ligi

+0

Ah, also ist es umgekehrt. Macht Sinn. – nhaarman

Antwort

3

Da Sie die @JvmOverloads Annotation verwenden, generiert der Compiler 3 überladene Konstruktoren. Diese Annotation wird hauptsächlich verwendet, um Parameter in reinem Java auslassen zu können.

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR]) 
annotation class JvmOverloads 

Weist das Kotlin Compiler Überlastungen für diese Funktion Parameterwerte, die Standardersatz zu erzeugen.

Wenn eine Methode hat N Parameter und M von dem Standardwert hat, sind M Überlastungen erzeugt: Die erste nimmt N-1-Parameter (alle außer die letzten, die einen Standardwert annimmt), nimmt die zweite N -2 Parameter und so weiter.

Wenn der Konstruktor mit einer beliebigen Anzahl von Parametern in Kotlin Aufruf, wird die Standard-3-Parameter-Konstruktor aufgerufen werden - wo die default values für Parameter verwendet werden, die weggelassen werden.
So macht es Sinn, dass Jacoco die Überladungen nicht als abgedeckt markiert: sie sind nicht.

Wie @voddan sagte, diese Überladungen werden generiert und garantiert korrekt. Es macht wenig Sinn, diese getrennt zu testen.

Wenn Sie jedoch vollständige Abdeckung wünschen, entfernen Sie die @JvmOverloads Annotation. Dies sollte verhindern, dass zusätzliche Überlastungen erzeugt werden.

Wenn Sie die Annotation nicht entfernen können, weil Sie den überladenen Konstruktor von Java aufrufen, dann macht es Sinn, eine Java-Testsuite zu haben, die diese abdeckt: Es ist ein realistisches Szenario, das Sie abdecken möchten.

+1

technisch der "Standard-3-Parameter-Konstruktor" hat 4 Parameter (der letzte ist Maske) – voddan

2

Sind Sie sicher, dass Sie eine 100% Deckung für diese Konstrukteure benötigen? Diese Konstruktoren werden vom Compiler automatisch generiert, was ihre Korrektheit garantiert (in einem größeren Ausmaß als die Codeabdeckung).

IMO es ist genug, um den Konstruktor mit allen benutzerdefinierten Parametern zu testen. Ein zusätzlicher Test für alle Standardparameter kann die Berechnung der Standardwerte umfassen.

Insgesamt ist das Testen eines automatisch generierten Codes möglicherweise nicht die beste Idee.

+0

Ich hätte gerne einen hohen Gesamtabdeckungsprozentsatz – ligi

+1

@ligi Das Hinzufügen unnötiger Magie zu deinem Code, nur um bessere Zahlen in Berichten zu bekommen, ist eine schlechte Übung und du solltest sie vermeiden. Stellen Sie nur sicher, dass Ihre wichtigsten Methoden abgedeckt sind. – waste