سؤال

فيما يلي فئة كتبتها في تطبيق ويب أقوم ببناء محرك Java Google App. لقد كتبت اختبارات وحدة باستخدام TETNG وجميع الاختبارات تمر. ثم أقوم بتشغيل ECLEMMA في الكسوف لرؤية تغطية الاختبار على التعليمات البرمجية الخاصة بي. تظهر جميع الوظائف تغطية 100٪ ولكن الملف ككل يظهر تغطية 27٪. أين هو رمز مكشوف 73٪ قادرا من؟

هل يمكن لأي شخص أن يساعدني في فهم كيف تعمل Eclemma ولماذا أحصل على التناقض بالأرقام؟

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;
    }
}

فيما يلي رمز الاختبار للفئة أعلاه.

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.");
    }
}
هل كانت مفيدة؟

المحلول

هذا تخمين، ولكن بناء على Javadoc presistencapable. يبدو أن الفئة المنسوجة مع رمز إضافي من قبل محسن JDO لتنفيذ الواجهة. إذا كانت هذه هي الحالة، فمن الممكن تماما أن يكون الرمز الإضافي غير مغطى به الاختبارات الخاصة بك. إذا قمت بإزالة التوضيحية وتشغيل الاختبارات مرة أخرى هل ترى التغطية المتوقعة؟

من الجافادوك:

في التنفيذ المرجعي، يقوم محسن JDO بتعديل الفصل لتنفيذ الإثارة قبل تحميل الفصل في بيئة وقت التشغيل. يضيف المحسن المرجعي أيضا التعليمات البرمجية لتنفيذ الأساليب المحددة بواسطة prisistencapable.

يمكنك أيضا محاولة استخدام decompiler مثل جاد. لفحص الطبقة المترجمة للتحقق مما إذا كانت الفئة المنسوجة بالفعل بطرق إضافية في وقت ترجمة (أو كعملية مسبقة). مرة أخرى من Javadoc:

قد يتم إنشاء الأساليب الإضافية في الواجهة الإثارة عن طريق معالجة ملف .java مسبقا، أو قد يتم إنشاؤها من أداة مباشرة. لا يتم تحديد التقنية الدقيقة لتوليد الطرق الإضافية بواسطة jdo.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top