2010-12-22 7 views
40

Ich leite EclEmma, ​​das Emma-Plugin für Eclipse, und der Coverage-Bericht zeigt nur teilweise Abdeckung für ein Enum, das ich definiert habe, obwohl es den einzigen Wert in der Enum als abgedeckt zeigt. Ich nehme an, dass es eine Deckungslücke für die implizierten Methoden gibt, die die Enum unterstützen, aber ich bin mir nicht ganz sicher.Emma-Coverage auf Enum-Typen

Zum Beispiel mit diesem Enum, unterstreicht EclEmma alles in grün, mit Ausnahme der Paketdeklaration:

package com.blah; 

public enum UserRole { 
HAS_ACCESS 
} 

Wenn ich die Abdeckung Details für die Klasse nach oben ziehen, sehe ich:

alt text

Meine Frage ist, was ist der beste Weg, 100% Abdeckung für meine Enum-Klassen mit EclEmma zu bekommen?

+0

Gibt Emma Ihnen keine Details über das, was Sie verpasst haben? Das scheint irgendwie komisch. –

+0

Meine 2 Cent, als ich schon einmal dort war und ich habe gesehen, wie meine Entwickler in diese Falle geraten sind. Es fühlt sich an, als ob Sie leidenschaftlicher sind (als gewünscht), wenn Sie die 100% ige Codeabdeckung erreichen. Das ist nur Zeitverschwendung. Coverage-Tool-Berichte sollten nur verwendet werden, um Möglichkeiten zur Codeverbesserung zu identifizieren (oder um technische Fehler zu reduzieren) und sollten nicht als MUST-Fixes angesehen werden. –

+0

Ich stimme zu, aber wenn es eine einfache Möglichkeit gibt, die Abdeckung zu bekommen, werde ich es nicht ignorieren. Es ist Lärm auf einem Coverage-Bericht, den ich lieber nicht durchforsten müsste, um zu echten Problemen zu kommen. Ich sehe es so, als hätte ich keine Compiler-Warnungen. Ich muss sie nicht alle reparieren, aber ich möchte nicht durch die weniger wichtigen filtern, um zu sehen, dass ich eine neue habe, die ziemlich wichtig ist. BTW, Ihre Antwort ist eine Nicht-Antwort und wäre besser als Kommentar platziert worden. –

Antwort

51

Was Sie sehen, ist ein versteckter Bytecode, der aufgrund einer Aufzählung erzeugt wird.

Um dieses Problem zu lösen, fügen Sie einen Aufruf an die values ​​() - und valueOf() -Methoden in der enum, wie bereits erwähnt von Carl Manaster und Peter Lawrey.

+11

Ich fand, dass alles, was ich tun musste, war, einen einzigen Aufruf von valueOf zu machen, und ich bekomme 100% Deckung. Ich dachte, ich müsste mehr tun. –

+0

Ich hatte das gleiche Problem mit 'enum' und' classes'. Ich konnte das mit "enum" lösen. Aber meine Code-Coverage deckt nicht den 'package'-Namen ab. Jeder Vorschlag wäre hilfreich – Amolb

+0

@Amolb Ihre beste Wette ist es, eine neue Frage mit allen relevanten Details zu stellen. Dieser war explizit über 'enum's, nicht' packages'. – deterb

2

Wir stießen auf ein ähnliches Problem, bei dem der Compiler Methoden für Aufzählungen wie values ​​() generierte, die in unserem Testcode normalerweise nicht aufgerufen wurden. Wir haben das Problem gelöst, indem wir die Anzahl unserer Enum-Objekte aus unserem Abschlussbericht herausgefiltert haben.

Aus diesem Grund verwende ich keine Code Coverage als ein Maß für die Vollständigkeit. Wenn ich an eine bessere Metrik denke, lasse ich es Sie wissen. :)

+3

Riffing weg von diesem: vielleicht könnten Sie eine allgemeine Testmethode schreiben, die irgendeine Aufzählung nimmt und seine angeborenen Methoden ausübt, gerade, um das Testberichtgeräusch loszuwerden. Es ist ein wenig riskant - wenn Sie dies mit allem machen würden, hätten Sie 100% Testabdeckung und keinen Testwert - aber ich denke, dass es Ihre Bedürfnisse erfüllen könnte. –

+2

Sie können ein generisches Enum-Trainingsgerät hinzufügen, das Werte() und valueOf() aufruft, die Sie mit ÜbungEnum (MyEnum.class) aufrufen können. –

+1

Danke für die Rückmeldung. Sie haben Recht mit dem Grund für die Abdeckung, aber ich denke nicht, dass Enums aus dem Coverage-Bericht zu ignorieren, der richtige Weg ist. –

9

Ich stimme mit anderen Plakaten überein, dass 100% Codeabdeckung fehlgeleitet werden kann. Aber ich muss zugeben, dass es eine 100% ige Abdeckung des neu geschriebenen Kerncodes ist.

Zum Glück, da alle Enums die gleiche "Klasse" erweitern, können Sie Ihre 100% mit ein wenig Hilfe von Ihrem Freund Reflexion erreichen.

Fügen Sie einfach die folgende statische Methode in einer Klasse hinzu, die von Ihren Testern aufgerufen werden kann. Verwenden Sie dazu [EnumTypeName] .class als Parameter.

public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) { 
    try { 
     for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) { 
     enumClass.getMethod("valueOf", String.class).invoke(null, o.toString()); 
     } 
    } 
    catch (Throwable e) { 
     throw new RuntimeException(e); 
    } 
    } 

diese statische Funktion implementiert wurde in einer Klasse Unter der Annahme, „Shared“ genannt, würden Sie nur für jede Enum diese Zeile enthalten müssen:

Shared.superficialEnumCodeCoverage(UserRole.class); 

Das Schlüsselwort ist ‚oberflächlich‘.

+5

Reflexion ist die schlimmste Art von Freund. Ein Verräter. –

+2

Dies funktioniert nur, wenn die 'toString' Methode in der enum-Klasse nicht überschrieben wird. In diesem Fall müssen Sie '.name' stattdessen aufrufen (was es notwendig macht, ein' o' von einem Enum-Typ zu haben (oder mindestens vom Typ 'Enum '). –

+0

wenn die Enumeration keine Felder hat , die Abdeckung ist noch unvollständig – datahaki

Verwandte Themen