2013-09-28 2 views
-1

Я новичок в тестировании JUnit и интересуюсь, как это работает. В настоящее время я пытаюсь пройти единичный тест.Java JUnit Тестирование по методу

Метод испытания

@Test 
    public void ensure_equals_method_is_properly_coded() 
    { 
    assertTrue(employees.get(0).equals(employees.get(2))); 
    assertFalse(employees.get(0).equals(employees.get(1))); 
    assertFalse(employees.get(0).equals(employees.get(3))); 
    } 

У меня есть ArrayList уже заселенный со значениями в нем. Насколько я понимаю, я должен написать метод, называемый equals(), чтобы этот тест прошел для моей задачи. Мой вопрос в том, как этот метод найдет метод для тестирования. Я создал метод equals() в классе под названием «Лица», но я не знаю, если его даже вызывают, когда я запускаю тест.

Мой второй вопрос ставит под вопрос логику в методе equal(). Пока у меня это есть.

public boolean equals() { 
     if (employees.get(0).equals(employees.get(2))) 

      return true; 
    return false; 
    } 

Это должно возвращать true, потому что первый тестовый элемент утверждает, что это правда. Правильно ли моя логика?

только для ясности здесь мой полный класс испытаний все уже существует.

public class Tests 
{ 
    List<Person> employees = new ArrayList<Person>(); 

    @Before 
    public void init() 
    { 
    Person anEmployee = new Employee(); 
    anEmployee.setName("Trevor Page"); 
    anEmployee.setSex("Male"); 
    Calendar cal = Calendar.getInstance(); 
    cal.set(1983, 0, 1); 
    anEmployee.setBirthday(cal.getTime()); 
    ((Employee)anEmployee).setJobTitle("Sr. Software Engineer"); 
    ((Employee)anEmployee).setOrganization(new Google("Google")); 
    employees.add(anEmployee); 

    anEmployee = new Employee(); 
    anEmployee.setName("Jane Doe"); 
    anEmployee.setSex("Female"); 
    anEmployee.setBirthday(cal.getTime()); 
    ((Employee)anEmployee).setJobTitle("Sr. Software Engineer"); 
    ((Employee)anEmployee).setOrganization(new Google("Google")); 
    employees.add(anEmployee); 

    anEmployee = new Employee(); 
    anEmployee.setName("Trevor Page"); 
    anEmployee.setSex("Male"); 
    anEmployee.setBirthday(cal.getTime()); 
    ((Employee)anEmployee).setJobTitle("Sr. Software Engineer"); 
    ((Employee)anEmployee).setOrganization(new Google("Google")); 
    employees.add(anEmployee); 

    anEmployee = new Employee(); 
    anEmployee.setName("Trevor Page"); 
    anEmployee.setSex("Male"); 
    anEmployee.setBirthday(cal.getTime()); 
    ((Employee)anEmployee).setJobTitle("Sr. Software Engineer"); 
    ((Employee)anEmployee).setOrganization(new Microsoft("Microsoft")); 
    employees.add(anEmployee); 
    } 

    @Test 
    public void ensure_toString_method_is_properly_coded() 
    { 
    String message = "Name: Trevor Page, Sex: Male" + 
    "\nJob Title: Sr. Software Engineer, Organization: Google"; 

    assertThat(employees.get(0).toString(), is(message)); 
    } 

    @Test 
    public void ensure_equals_method_is_properly_coded() 
    { 
    assertTrue(employees.get(0).equals(employees.get(2))); 
    assertFalse(employees.get(0).equals(employees.get(1))); 
    assertFalse(employees.get(0).equals(employees.get(3))); 
    } 

Вот мой полный класс лиц, который является абстрактным. У меня уже есть первый тестовый пример.

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 


public abstract class Person 
{ 
    public abstract String getName(); 
    public abstract String getSex(); 
    public abstract void setName(String name); 
    public abstract void setSex(String sex); 
    public abstract void setBirthday(Date birthdate); 
    public abstract Date getBirthday(); 
    public abstract String getJobTitle(); 
    public abstract String getNameOfOrganization(); 



    List<Person> employees = new ArrayList<Person>(); 



    @Override 
    public String toString() { 


    return "Name: " + getName() + ", Sex: " + getSex() + "\n" + "Job Title: " + getJobTitle() + ", Organization: " + getNameOfOrganization() ; 

    } 

} 

У меня есть другой класс под названием Employee, который расширяет этот абстрактный класс.

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

public class Employee extends Person 

{ 

    List<String> employees = new ArrayList<String>(); 

    @Override 
    public String getName() { 
     employees.add("Trevor Page"); 

     return employees.get(0); 
    } 

    @Override 
    public String getSex() { 

     employees.add("Male"); 
     return employees.get(1); 

    } 

    @Override 
    public void setName(String name) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void setSex(String sex) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void setBirthday(Date birthdate) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Date getBirthday() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void setJobTitle(String string) { 
     // TODO Auto-generated method stub 

    } 

    public String getJobTitle() { 

     employees.add("Sr. Software Engineer"); 

     return employees.get(2); 
    } 

    public void setOrganization(Google google) { 
     // TODO Auto-generated method stub 

    } 

    public void setOrganization(Microsoft microsoft) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public String getNameOfOrganization() { 
     employees.add("Google"); 
     return employees.get(3); 
    } 

} 

Я смог получить первый тест, чтобы работать удачей. Я не уверен, как тестирует модуль, чтобы проверить мои значения.

+0

Непонятно, где вы программировали этот метод equals? –

+0

на абстрактный класс с именем Лицо. –

+0

и где определена переменная, называемая «служащие»? –

ответ

0

Если вы внедрили equals в класс человека, вы можете утверждать, что два человека равны.

То, что вы выше эквивалентно

Person p1 = employees.get(0); 
Person p2 = employees.get(2); 
assertTrue(p1.equals(p2)); 

выше, вы вызываете метод Equals непосредственно.

Но Вы можете также сделать

assertEquals(p1,p2); 

В чьих случае метод Person.equals вызывается под капотом.

Методы assertEquals, assertTrue, assertFalse и некоторые другие могут быть статически импортированы из org.junit.Assert класса, то вроде:

import static org.junit.Assert.assertTrue; 
import static org.junit.Assert.assertFalse; 
import static org.junit.Assert.assertEquals; 

Или гораздо проще форма import static org.junit.Assert.*;

Вы реализация равных должны просто проверить если один сотрудник равен другому, он не должен знать о списке сотрудников, как вы, кажется, подразумеваете.

Например

class Person { 
    public boolean equals(Object o) { 
     if(this==o) { 
     return true; 
     } 
     if(o instanceof Person) { 
     Person other = (Person) o; 
     return (this.name == other.name) || (this.name != null && this.name.equals(other.name); 
     } 
     reurn false; 
    } 
} 

Ваше тестирование будет заключаться в проверке того, что это equals реализация является правильной, другими словами, что он удовлетворяет свойства, как, транзитивности симметрии и рефлексивность и т.д. Обратитесь к Javadocs из Object.equals метода чтобы узнать больше об этом.

+0

Все утверждения находятся в тестовом классе. –

0

Что сказал Эдвин. Также:

Тестирование должно быть равнозначным и утверждать возвращаемое логическое значение.

Возможно, это сбивает с толку, поскольку нет очевидного способа настройки ценности сотрудников. Обычный способ состоит в том, чтобы видимость полевого пакета сотрудников (без модификатора доступности) и класса Test в том же пакете, что и тестируемый класс.

Редактировать: Если класс Person является абстрактным, рассмотрите возможность создания конкретного подкласса в качестве образца, который позволяет вам выполнить единый тест методом equals.

0

Позвольте мне начать с того, что ваш метод equals является не, который вызывается в тесте. Вы фактически вызываете Object.equals(Object o) вместо Person.equals(). Вы заметили разницу в подписи? Ваш метод equals не принимает параметр, что необычно - вы должны сравнивать эквивалентность с что-то еще.

Кроме того, настройка вашего теста неуместна. Вы должны установить блок тестовых данных для проверки. Уберите ненужные структуры данных; Я имею в виду, что вы только сравниваете два объекта в вызове equals().

Давайте исправим эти две проблемы.

Ваш equals метод должен переопределить Object.equals. Для этого вы создаете метод, который имеет одну и ту же подпись.

@Override 
public boolean equals(Object other) { 
    // What makes two Person instances equivalent? 
} 

Я оставлю эту реализацию до вас. Учитывайте случай, в котором other - null.

Далее, тест. То, как я предпочитаю настраивать свои тесты, - это небольшие куски. Для проверки этой логики необходимо проверить несколько аспектов:

  • Имеют ли два экземпляра одинаковые значения?
  • Имеют ли они то же значение для hashCode()? (Это соглашение, что если два объекта равны, то их hashCode равен.)
  • Являются ли они равными, если экземпляры разные? НАПРИМЕР. сравнение Person с Integer должно быть ...
  • Являются ли они равными, если один из экземпляров null?

Как минимум, это четыре тестовых случая.

@Test 
public void equals_equivalentInstances() { 
    // given 
    // two objects that are initialized in the exact same way 
    // when + then 
    // call the equals() method and assert that the statement is true 
} 


@Test 
public void equals_hashCodeMatches() { 
    // given 
    // two objects that are initialized in the exact same way 
    // when + then 
    // call the hashCode() method of both and assert their equivalence 
} 


@Test 
public void equals_handlesDifferentObjectTypes() { 
    // given 
    // a Person class and some other Object 
    // when + then 
    // call the equals() method and assert that they are not equal 
} 

@Test 
public void equals_handlesNull() { 
    // given 
    // two Person classes, one of them initialized to null 
    // when + then 
    // call the equals() method and assert that they are not equal 
} 
Смежные вопросы