2014-12-05 2 views
10

Я в основном ищу модульную структуру тестирования, которую я могу использовать для сравнения POJO, которые не переопределяют методы equals и hascode. Я посмотрел на JUnit, Test NG и Mockito, но они, похоже, не решают эту цель.Как я могу сравнить POJO по своим полям рефлексивно

Для примера рассмотрим следующий код:

public class CarBean { 

    private String brand; 
    private String color; 

    public CarBean(){ 
    } 

    public CarBean (String brand, String color){ 
     this.brand= brand; 
     this.color= color; 
    } 

    /** 
    * @return the brand 
    */ 
    public String getBrand() { 
     return brand; 
    } 

    /** 
    * @param the brand to set 
    */ 
    public void setBrand(String brand) { 
     this.brand= brand; 
    } 

    /** 
    * @return the color 
    */ 
    public String getColor() { 
     return color; 
    } 

    /** 
    * @param the color to set 
    */ 
    public void setColor(String color) { 
     this.color= color; 
    } 
} 

POJO CarBean представляет реальную мировую машину. Он имеет два параметра: бренд и цвет. Теперь предположим, что у вас есть два автомобильных объекта, как показано ниже:

CarBean car1 = new CarBean("Ford","Black"); 
CarBean car2 = new CarBean("Ford","Black"); 

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

car1.equals(car2); // This returns false 

Теперь мне нужна модульное тестирование метод, который возвращает объект CarBean. В этом случае мне нужно было бы либо сравнить атрибуты carbean по одному, либо мне понадобится реализовать методы equals() и hashcode().

Итак, мой вопрос: существует ли уже модульная система тестирования, которая может справиться с этим?

+0

Вы хотите посмотреть Dozer ... –

+0

Вы можете перефразировать вопрос.«Как я могу сравнивать POJO по своим полям с отражением», скорее всего, будет по теме для сайта, но явно запрашивать фреймворки не по теме в соответствии с [пунктом 4 этого FAQ] (http://stackoverflow.com/ помощь/по теме). Тем не менее, быстрый поиск не дает хорошего ответа по теме, так что этот вопрос, вероятно, полезен будущим пользователям с некоторыми изменениями. –

+0

Спасибо @JeffBowman. Делает смысл –

ответ

4

Единицы, похоже, решают эту задачу для меня. Следующие API-интерфейсы могут объективно сравнивать объекты. Можно сравнить, даже если атрибуты сами в POJO определяются пользователем POJOs:

import static org.unitils.reflectionassert.ReflectionAssert.*; 

// Exact field-by-field comparison 
assertReflectionEquals(new Person("John", "Doe", new Address("New street", 5, "Brussels")), 
           new Person("John", "Doe", new Address("New street", 5, "Brussels")); 

// Ignore Null/0 values in the expected object 
assertReflectionEquals(new Person("John", null, new Address("New street", 0, null)), 
           new Person("John", "Doe", new Address("New street", 5, "Brussels"), 
           ReflectionComparatorMode.IGNORE_DEFAULTS); 

// Ignore collection order 
assertReflectionEquals(Arrays.asList(new Person("John"), new Person("Jane")), 
           new Person[] {new Person("Jane"), new Person("John")}, 
           ReflectionComparatorMode.LENIENT_ORDER); 

// Ignore null/0 values + collection order 
assertLenientEquals(Arrays.asList(new Person("John"), null), 
           new Person[] {new Person("Jane", "Doe"), new Person("John", "Doe")}); 

// Check only the firstName property 
assertPropertyLenientEquals("firstName", Arrays.asList("John", "Jane"), 
           new Person[] {new Person("Jane", "Doe"), new Person("John", "Doe")}); 

Дополнительная информация на Unitils Cookbook

2

Так как это, вероятно, будет осуществляться с помощью отражения «отражения равен» разумный срок поиска, и в самом деле Google находит:

http://www.unitils.org/tutorial-reflectionassert.html

+0

Спасибо. Это несколько близко к тому, что я ищу. Позвольте мне углубиться в эту структуру. –

-2

Ничто не мешает вам писать собственные сравнения

Использование JUnit :

написать статический метод, который принимает 2 объекта и делает эти утверждения:

public static void sameBrandAndColor(Car expected, Car actual){ 
    assertEquals(expected.getBrand(), actual.getBrand()); 
    assertEquals(expected.getColor(), actual.getColor()); 
} 

Затем в ваших тестах просто позвоните на свой метод сравнения.

@Test 
public void test(){ 
    ... 
    sameBrandAndColor(car1, car2); 
} 
+0

Очевидно, но то, что я ищу, уменьшает ручное усилие и автоматизирует вещи –

+0

. В этом случае это всего лишь 3 строки кода. Это не слишком много усилий для ручного труда, и он показывает намерения. – dkatzel

+0

да, с приведенным выше кодом только 3 строки. Но в моем приложении pojos будет иметь 50 плюс атрибуты, некоторые из них являются еще одним pojos с аналогичным количеством атрибутов. –

2

Этот тип отражения построен в Hamcrest в SamePropertyValuesAs, который сравнивает боба именем свойства (getFoo, isBar) вместо полей, которые, вероятно, власть их. Поддержка Core Hamcrest встроена в JUnit, поэтому вам просто нужно добавить библиотеку Hamcrest, которая включает в себя SamePropertyValuesAs.

assertThat(car1, samePropertyValuesAs(car2)); 
2

переопределять значение ToString() метод в классе Pojo как ниже

@Override 
public String toString() { 
    return "brand: " + this.brand + ",color: " + this.color; 
} 


car1.toString().equals(car2.toString()); //It will return true 

В случае, если у вас есть большое значение параметра, я предлагаю вам перейти от более детального кода

public static boolean comparePOJO(Object obj1, Object obj2) { 
    return new Gson().toJson(obj1).equals(new Gson().toJson(obj2)); 
} 
comparePOJO(car1,car2); //It will return true 
Смежные вопросы