2015-05-08 17 views
6

Ich habe eine Klasse, wie folgend:So fügen Sie statische Membervariablen hinzu Jacoco Test Coverage?

public class XConstants { 

    public static final int A_TYPE = 1; 
    public static final int B_TYPE = 2; 
} 

ich beiden Variablen in meinen Tests verwende, aber wenn ich die Testabdeckung mit Jacoco untersuchen zeigen sie% 0 Testabdeckung für diese Klasse. Meine Vermutung ist, weil ich diese Klasse niemals instanziiere, verwende einfach ihre statischen Variablen. Ich habe versucht, eine Instanz zu erstellen und die Testabdeckung ging% 100. Wie kann ich dieses Problem überwinden?

Antwort

5

Der JaCoCo misst die Testabdeckung basierend auf dem Prozentsatz des Bytecodes, der tatsächlich ausgeführt wurde. Das Deklarieren eines statischen finalen Primitivs oder einer String-Konstanten erzeugt keinen Bytecode zum Ausführen, sondern ist nur ein Eintrag innerhalb des Konstantenpools. Die einzige Bytecode Sie hier haben, ist eine implizite Standardkonstruktor, in der Regel wie folgt aus:

aload_0 
invokespecial Object.<init> 
return 

Also, wenn Sie es nicht nennen, Sie haben 0%, wenn Sie es nennen, Sie zu 100% haben.

Mein Vorschlag ist, dieses Problem zu ignorieren. Sie sollten nicht versuchen, 100% Deckung zu erreichen, egal was passiert. Immerhin garantiert es nichts: Selbst 100% Covered Code kann schwerwiegende Bugs enthalten.

+0

Dank @Tagir, das macht Sinn. Kennen Sie Workarounds? Was ist, wenn ich Enum verwende? –

+1

Hinzugefügt einen Vorschlag, was zu tun ist. –

1

In unserem Projekt überwinden wir Problem keine Abdeckung für die Klasse, die nur Konstanten, die von privaten Konstruktor zu schaffen (nach Muster von java.lang.Math):

private XConstants {} 

und dann Trajano commons-testing Bibliothek zu behaupten, dass dieser Konstruktor privat ist, und rufen Abdeckung:

2

Sie haben eine Klasse erstellt, die instanziiert werden kann, aber Sie haben sie nie instanziiert. Die einfache Lösung für eine "Klasse voller Konstanten" besteht darin, sie zu einer Schnittstelle zu machen. Beachten Sie außerdem, dass Variablen in einer Schnittstelle standardmäßig öffentlich, statisch und endgültig sind. Ihr Code kann also einfach so aussehen:

public interface XConstants { 
    int A_TYPE = 1; 
    int B_TYPE = 2; 
} 
+0

Einfach und effektiv. :) Vielen Dank! – Gorbag