метод тестирования junit для методов считывания и методов set

У меня есть много бобов Java в моем проекте. Я должен генерировать Тестовый класс JUnit для них. Методы тестирования, сгенерированные с помощью Eclipse 3.2 и junit 4.4, похожи на следующее:

public void testGetName() {
        // fail("Not yet implemented");
    }

    @Test
    public void testSetName() {
        // fail("Not yet implemented");
    }

    @Test
    public void testGetEmployeeid() {
        // fail("Not yet implemented");
    }

    @Test
    public void testSetEmployeeid() {
        // fail("Not yet implemented");
    }

некоторые мои бобы имеют больше чем 100 полей...

Есть ли путь, которым я могу получить единственный метод тестирования для обоих методы считывания и методы set как testEmployeeid(), testName() так, чтобы в этих методах я мог протестировать оба своих метода set и методы считывания вместо того, чтобы использовать 2 различных метода тестирования для них...

Как я должен настроить затмение, чтобы сделать это?

6
задан Chase Gilliam 19 June 2015 в 16:05
поделиться

3 ответа

Философия разработки через тестирование гласит: «Тестируйте все, что может сломаться». То есть сосредоточьтесь на полезных тестах, а не пишите тесты просто ради них.

Геттеры и сеттеры почти всегда представляют собой тривиальный код, который не стоит тестировать отдельно.

Я знаю, что это не прямой ответ на вашу просьбу, но я подумал, что это все же может помочь указать на это ;-) Так зачем вам вообще вообще нужно писать тесты для всех этих геттеров и сеттеров?

23
ответ дан 8 December 2019 в 02:16
поделиться

Вы могли бы использовать beanutils Apache Commons для автоматизации этого:

http://commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/PropertyUtils.html#getSimpleProperty%28java. lang.Object, java.lang.String% 29

Например, существует метод describe (Object bean) , который возвращает карту всех читаемых атрибутов (т. е. геттеров).

Затем повторите эту карту и вызовите:

setSimpleProperty(Object bean, String name, Object value)

и

public static Object getSimpleProperty(Object bean, String name)

И хотя я согласен с другим постером, но геттеры / сеттеры довольно тривиальны - я думаю, что их все же стоит протестировать - для устранения опечаток проверьте слушателей изменения свойств и т. д.

Например, это будет динамически извлекать получатели bean-компонента:

import java.io.Serializable;
import java.util.Set;
import org.apache.commons.beanutils.PropertyUtils;

public class MyTestBean implements Serializable {
    private int a;
    private int b;
    private int c;
    private String x;
    private String y;
    private String z;

    public static void main(String[] args) throws Exception {
    MyTestBean bean=new MyTestBean();
    Set prop=PropertyUtils.describe(bean).keySet();
    for (Object o : prop) {
        System.out.println((String)o);
    }
    }

    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
    public int getC() {
        return c;
    }
    public void setC(int c) {
        this.c = c;
    }
    public String getX() {
        return x;
    }
    public void setX(String x) {
        this.x = x;
    }
    public String getY() {
        return y;
    }
    public void setY(String y) {
        this.y = y;
    }
    public String getZ() {
        return z;
    }
    public void setZ(String z) {
        this.z = z;
    }}

Вам нужно будет загрузить как BeanUtils, так и CommonsLogging, а также JAR обеих библиотек в свой проект для запуска этого кода.

5
ответ дан 8 December 2019 в 02:16
поделиться

Пространства имен - это способ обтекания кода, чтобы избежать путаницы и имен от конфликтующих. Например:

File common1.h:

namespace intutils
{
    int addNumbers(int a, int b)
    {
        return a + b;
    }
}

Usage file:

#include "common1.h"    
int main()
{
    int five = 0;
    five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace.
    five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within.

    using namespace intutils;
    five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace.
}

Итак, при записи с помощью пространства имен std компилятор должен знать, что в случае сомнений он должен искать в пространстве имен std для функций и т. д., для которых он не может найти определения. Это обычно используется в примере (и производстве) кода просто потому, что это делает ввод общих функций и т.д., как cout быстрее, чем необходимость полностью квалифицировать каждый как std:: cout .

-121--1696296-

Это одно решение, от DjangoSnippets ; btw, не уверен, почему приведенный ниже код не использует urlparse ; но это может быть исправлено: -)

(Глядя на другие ответы, кажется, у вас есть много вариантов на выбор. Этот вариант не может быть предпочтительным, поскольку он полагается на бесплатную стороннюю услугу.)

from urllib2 import urlopen, Request
import re, socket
from django.conf import settings

domain_re = re.compile('^(http|https):\/\/?([^\/]+)')
domain = domain_re.match(settings.SITE_URL).group(2)

def getUserCountry(ip):
    url = "http://api.wipmania.com/" + ip + "?" + domain
    socket.setdefaulttimeout(5)
    headers = {'Typ':'django','Ver':'1.1.1','Connection':'Close'}
    try:
        req = Request(url, None, headers)
        urlfile = urlopen(req)
        land = urlfile.read()
        urlfile.close()
        return land[:2]
    except Exception:
        return "XX"

Примечание от WIPmania : "Использование API бесплатно для любых целей, личных или деловых, если вы делаете менее 10,000 запросов в календарный день. Простой, но мощный API, позволяющий запрашивать базу данных WorldIP по одной ссылке "

-121--1554173-

При наличии 100 полей в классе (с соответствующими установщиками/получателями) возникает подозрение, что объектная модель разложена неправильно. 100 + полей звучит как необычайное количество полей для объекта, и я думаю, что у него есть несколько сфер ответственности, которые можно разделить на несколько более специализированных объектов.

11
ответ дан 8 December 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: