In diesem Eintrag wird davon ausgegangen, dass Sie Lombok, das den Quellcode generiert, und das Tool zur Messung der Abdeckung Jacoco verwenden. Ich werde ein Beispiel vorbereiten und vorstellen, wie die Abdeckung in) erhöht werden kann.
Der Zweck dieses Eintrags besteht darin, Ihnen den Einstieg zu erleichtern, wenn Sie Lombok mit möglichst wenig Code verwenden und die Abdeckung in Jacoco erhöhen möchten. Es werden nicht alle Funktionen der einzelnen Tools erläutert.
Lassen Sie uns abschließend den automatisch generierten Code vom Ziel der Abdeckungsprüfung ausschließen, indem Sie auf der Lombok-Seite "lombok.addLombokGeneratedAnnotation = true" mit Jacoco 0.8.0 (veröffentlicht am 1/2/2018) oder höher angeben. Ist ein großer Punkt.
In Qiita über Lombok, Jacoco
[Suche nach Qiita](https://qiita.com/search?utf8= ✓ & sort = & q = lombok) gab es 347.
[Suche nach Qiita](https://qiita.com/search?utf8= ✓ & sort = & q = jacoco) gab es 79.
Es gibt viele (Stand 26. Mai 2018), aber das Folgende wird hilfreich sein.
Als Beispiel habe ich Spring Boot erstellt, um einfache Entitäten über REST Controller zu speichern und anzuzeigen.
Es funktioniert so.
(Anmeldung)
$ curl -H 'Content-Type:application/json' -d '{"intField":123}' http://localhost:8080
(Referenz)
$ curl http://localhost:8080/
[{"id":"2815cfc6-f908-4c7d-a20b-b2c52953555f","intField":123,"longField":0,"stringField":null,"charField"
(1 Detail)
$ curl http://localhost:8080/2815cfc6-f908-4c7d-a20b-b2c52953555f
{"id":"2815cfc6-f908-4c7d-a20b-b2c52953555f","intField":123,"longField":0,"stringField":null,"charField":"\u0000","byteField":0}hirokis-M
Es wird im Initial State Repository gespeichert.
In dieser Version wird es implementiert, ohne die praktischen Funktionen von lombok zu verwenden.
$ ./gradlew test
$ ./gradlew jacocoTestReport
Die Berichterstattung sieht so aus.
@ Data
SampleEntity.java
public class SampleEntity {
private SampleId id;
private int intField;
private long longField;
private String stringField;
private char charField;
private byte byteField;
/**
* @return the id
*/
public SampleId getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(SampleId id) {
this.id = id;
}
/**
* @return the intField
*/
public int getIntField() {
return intField;
}
/**
* @param intField the intField to set
*/
public void setIntField(int intField) {
this.intField = intField;
}
/**
* @return the longField
*/
public long getLongField() {
return longField;
}
/**
* @param longField the longField to set
*/
public void setLongField(long longField) {
this.longField = longField;
}
/**
* @return the stringField
*/
public String getStringField() {
return stringField;
}
/**
* @param stringField the stringField to set
*/
public void setStringField(String stringField) {
this.stringField = stringField;
}
/**
* @return the charField
*/
public char getCharField() {
return charField;
}
/**
* @param charField the charField to set
*/
public void setCharField(char charField) {
this.charField = charField;
}
/**
* @return the byteField
*/
public byte getByteField() {
return byteField;
}
/**
* @param byteField the byteField to set
*/
public void setByteField(byte byteField) {
this.byteField = byteField;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + byteField;
result = prime * result + charField;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + intField;
result = prime * result + (int) (longField ^ (longField >>> 32));
result = prime * result
+ ((stringField == null) ? 0 : stringField.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SampleEntity other = (SampleEntity) obj;
if (byteField != other.byteField)
return false;
if (charField != other.charField)
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (intField != other.intField)
return false;
if (longField != other.longField)
return false;
if (stringField == null) {
if (other.stringField != null)
return false;
} else if (!stringField.equals(other.stringField))
return false;
return true;
}
/**
* @param id
* @param intField
* @param longField
* @param stringField
* @param charField
* @param byteField
*/
public SampleEntity(SampleId id, int intField, long longField,
String stringField, char charField, byte byteField) {
super();
this.id = id;
this.intField = intField;
this.longField = longField;
this.stringField = stringField;
this.charField = charField;
this.byteField = byteField;
}
public SampleEntity() {
super();
};
}
SampleEntity.java
@Data
public class SampleEntity {
private SampleId id;
private int intField;
private long longField;
private String stringField;
private char charField;
private byte byteField;
}
Wenn Sie mit der IDE (Eclipse in diesem Eintrag) überprüfen, auf die der Lombok-Plug angewendet wird, können Sie sehen, dass Setter, Getter, toString und HashCode generiert werden.
@ RequiredArgsConstructor
Wenn Sie ein Feld mit @Autowired of Spring injizieren, kann es schwierig sein, es direkt zum Testen usw. zu ersetzen, oder es kann Platz beanspruchen, wenn viele Dinge zu verwenden sind. Injizieren Sie es daher mit dem Konstruktor. Ich werde es ändern.
SampleApi.java
@RestController
@RequestMapping("/")
public class SampleApi {
@Autowired
private SampleFacade sampleFacade;
SampleApi.java
@RestController
@RequestMapping("/")
@RequiredArgsConstructor
public class SampleApi {
private final SampleFacade sampleFacade;
Bisher sieht der Jacoco-Bericht so aus.
Hier ist das Domain-Paket ein guter Anteil, aber wenn Sie hineinschauen, ist es natürlich der Code, der automatisch von lombok generiert wird. Wenn das Verhalten von Lombok positiv ist, ist es wenig sinnvoll zu testen, was erzeugt wird.
Aus diesem Grund geben wir an, dass der von Lombok generierte Code vom Test ausgeschlossen werden soll. Legen Sie die folgende Datei in das Projektverzeichnis und wiederholen Sie den Test.
lombok.config
lombok.addLombokGeneratedAnnotation = true
$ ./gradlew clean
$ ./gradlew test
$ ./gradlew jacocoTestReport
Und die Abdeckung ändert sich so. Die rote Situation hat sich nicht geändert, seit ich den Testcode noch nicht geschrieben habe, aber der Domänenbereich wurde stark reduziert, und die Gesamtcode-Anweisung wurde von 731 auf 170 erheblich reduziert.
Eine Beschreibung der Werte, die in lombok.config angegeben werden können, finden Sie auf der offiziellen Website von lombok.
Ich habe das oben genannte als v0.2 auf GitHub.
Im Unit-Test wird die Abdeckung auf 100% festgelegt, indem vorerst 1 Durchgang bestanden wird Beispiel auf GitHub v0.3 Es wird /releases/tag/v0.3 sein).
(Referenz) Wenn Sie nun die Ausschlusseinstellung wiederherstellen (nicht angeben), tritt diese Situation auf.
In diesem Eintrag habe ich gesehen, wie der automatisch generierte Code von lombok von Abdeckungsmessungen ausgeschlossen werden kann, und ich habe den Beispielcode bis zu dem Punkt gezeigt, an dem er tatsächlich funktioniert.
Zusätzlich zur Verwendung der Lombok-Funktion im Beispiel dieses Eintrags wurde Verschiedene auf der ursprünglichen Website eingeführt, daher möchte ich zu einem anderen Zeitpunkt ein Verwendungsbeispiel vorstellen. Überlegen.
Recommended Posts