课堂中的示例数据 - 好的或坏的练习?

时间:2014-09-25 11:55:44

标签: java

在可以实例化的类中编写示例数据是一个好主意吗?

在以下示例中,我使用了一些静态变量,用于通过以下方式直接访问某些联系人:

Contact.contact101()
...

我在测试中使用这个示例数据定义,并且不想编写一种包含所有示例数据的util类。

package com.example.webdriver.util.builder.model;

import com.google.gson.annotations.SerializedName;
import com.example.webdriver.util.builder.LocalStorageBuilder;
import com.example.webdriver.util.builder.enumaration.UserStatus;

public class Contact {

    @SerializedName("ID")
    private Long id;
    @SerializedName("puid")
    private Long principleUserId;
    @SerializedName("cuid")
    private Long contactUserId;
    @SerializedName("v")
    private int visible;
    @SerializedName("ustat")
    private String userStatus;
    @SerializedName("ats")
    private Long addedTimeStamp;

    private static Contact contact101;
    private static Contact contact102;
    private static Contact contact305;
    private static Contact contact302;
    private static Contact contact301;
    private static Contact contact382;


    public Contact() {
        this.id = LocalStorageBuilder.getContactIdCounter();
        this.principleUserId = LocalStorageBuilder.principalUserId;
        this.contactUserId = 301L;
        this.visible = 1;
        this.userStatus = String.valueOf(UserStatus.ONLINE.getUserStatus());
        this.addedTimeStamp = 1410168552386L;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getPrincipleUserId() {
        return principleUserId;
    }

    public void setPrincipleUserId(Long principleUserId) {
        this.principleUserId = principleUserId;
    }

    public int getVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        if (visible) {
            this.visible = 1;
        } else {
            this.visible = 0;
        }
    }

    public String getUserStatus() {
        return userStatus;
    }

    public void setUserStatus(UserStatus userStatus) {
        this.userStatus = String.valueOf(userStatus.getUserStatus());
    }

    public Long getAddedTimeStamp() {
        return addedTimeStamp;
    }

    public void setAddedTimeStamp(Long addedTimeStamp) {
        this.addedTimeStamp = addedTimeStamp;
    }

    public Long getContactUserId() {
        return contactUserId;
    }

    public void setContactUserId(Long contactUserId) {
        this.contactUserId = contactUserId;
    }


    // Example data

    public static Contact contact102() {
        if (contact102 == null) {
            contact102 = createContact(102L);
        }
        contact102.setPrincipleUserId(LocalStorageBuilder.principalUserId);
        return contact102;
    }

    public static Contact contact302() {
        if (contact302 == null) {
            contact302 = createContact(302L);
        }
        contact302.setPrincipleUserId(LocalStorageBuilder.principalUserId);
        return contact302;
    }

    public static Contact contact305() {
        if (contact305 == null) {
            contact305 = createContact(305L);
        }
        contact305.setPrincipleUserId(LocalStorageBuilder.principalUserId);
        return contactAVG305;
    }


    private static Contact createContact(Long contactUserId) {
        Contact contact = new Contact();
        contact.setContactUserId(contactUserId);
        contact.setPrincipleUserId(LocalStorageBuilder.principalUserId);
        contact.setUserStatus(UserStatus.ONLINE);
        contact.setAddedTimeStamp(1410168552386L);
        contact.setVisible(true);
        return contact;
    }
}

2 个答案:

答案 0 :(得分:2)

不,请改用某种工厂。

互联网上有各种术语,ObjectMother是一个,但我更喜欢TestDataFactory

public class TestDataFactory {
    private static Contact createContact(Long contactUserId) {
        Contact contact = new Contact();
        contact.setContactUserId(contactUserId);
        contact.setPrincipleUserId(LocalStorageBuilder.principalUserId);
        contact.setUserStatus(UserStatus.ONLINE);
        contact.setAddedTimeStamp(1410168552386L);
        contact.setVisible(true);
        return contact;
    }
}

优势在于,它可以存储在您的test来源中,而不是使用测试代码来规范您的域对象。

答案 1 :(得分:1)

这使得重新分解很难,并且根据类定义,这在此处无效。

正确的位置是创建另一个名为TestDataHelper的类,并创建一个名为getContacts的方法并返回Contact个对象的列表。

关注点应始终分开。这就是Java的工作原理!