Java-Einheit Testabdeckung Zahlen nicht übereinstimmen
-
13-09-2019 - |
Frage
Hier ist eine Klasse-I in einer Web-Anwendung geschrieben habe ich Java Google App Engine bin Gebäude. Ich habe Unit Tests geschrieben TestNG verwendet und alle Tests bestanden. Ich laufe dann EclEmma in Eclipse die Testabdeckung auf meinem Code zu sehen. Alle Funktionen zeigen 100% Abdeckung, aber die Datei als Ganzes zeigt etwa 27% Deckung. Wo ist der 73% ungedeckte Code kommt aus?
Kann mir jemand helfen zu verstehen, wie EclEmma funktioniert und warum ich die Diskrepanz in Zahlen bin immer?
package com.skaxo.sports.models;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(identityType= IdentityType.APPLICATION)
public class Account {
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String userId;
@Persistent
private String firstName;
@Persistent
private String lastName;
@Persistent
private String email;
@Persistent
private boolean termsOfService;
@Persistent
private boolean systemEmails;
public Account() {}
public Account(String firstName, String lastName, String email) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public Account(String userId) {
super();
this.userId = userId;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean acceptedTermsOfService() {
return termsOfService;
}
public void setTermsOfService(boolean termsOfService) {
this.termsOfService = termsOfService;
}
public boolean acceptedSystemEmails() {
return systemEmails;
}
public void setSystemEmails(boolean systemEmails) {
this.systemEmails = systemEmails;
}
}
Im Folgenden ist der Testcode für die obige Klasse.
package com.skaxo.sports.models;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.assertFalse;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class AccountTest {
@Test
public void testId() {
Account a = new Account();
a.setId(1L);
assertEquals((Long) 1L, a.getId(), "ID");
a.setId(3L);
assertNotNull(a.getId(), "The ID is set to null.");
}
@Test
public void testUserId() {
Account a = new Account();
a.setUserId("123456ABC");
assertEquals(a.getUserId(), "123456ABC", "User ID incorrect.");
a = new Account("123456ABC");
assertEquals(a.getUserId(), "123456ABC", "User ID incorrect.");
}
@Test
public void testFirstName() {
Account a = new Account("Test", "User", "test@example.com");
assertEquals(a.getFirstName(), "Test",
"User first name not equal to 'Test'.");
a.setFirstName("John");
assertEquals(a.getFirstName(), "John",
"User first name not equal to 'John'.");
}
@Test
public void testLastName() {
Account a = new Account("Test", "User", "test@example.com");
assertEquals(a.getLastName(), "User",
"User last name not equal to 'User'.");
a.setLastName("Doe");
assertEquals(a.getLastName(), "Doe",
"User last name not equal to 'Doe'.");
}
@Test
public void testEmail() {
Account a = new Account("Test", "User", "test@example.com");
assertEquals(a.getEmail(), "test@example.com",
"User email not equal to 'test@example.com'.");
a.setEmail("john@example.com");
assertEquals(a.getEmail(), "john@example.com",
"User email not equal to 'john@example.com'.");
}
@Test
public void testAcceptedTermsOfService() {
Account a = new Account();
a.setTermsOfService(true);
assertTrue(a.acceptedTermsOfService(),
"Accepted Terms of Service not true.");
a.setTermsOfService(false);
assertFalse(a.acceptedTermsOfService(),
"Accepted Terms of Service not false.");
}
@Test
public void testAcceptedSystemEmails() {
Account a = new Account();
a.setSystemEmails(true);
assertTrue(a.acceptedSystemEmails(), "System Emails is not true.");
a.setSystemEmails(false);
assertFalse(a.acceptedSystemEmails(), "System Emails is not false.");
}
}
Lösung
Das ist eine Vermutung, aber auf der Grundlage der Javadoc für JAD die kompilierte Klasse zu überprüfen, ob die Klasse zu überprüfen ist in der Tat mit zusätzlichen Methoden zur Kompilierzeit (oder als Pre-Prozess) gewebt. Wieder aus dem Javadoc:
Die zusätzlichen Methoden in der PersistenceCapable Schnittstelle könnten durch Vorverarbeiten einer .java-Datei erzeugt werden, oder können von einem Werkzeug direkt erzeugt werden. Die genaue Technik für die zusätzliche Methoden Erzeugung wird nicht von JDO angegeben.