четверг, 21 ноября 2013 г.

JUnit - тестирование

Написать код мало. Без его тестирования никуда. Один из популярных фрэймоворков для этих целей является JUnit. Предлагаю ознакомиться с материалом тут , заодно посмотреть там видео и конечно попробовать проделать все самим.
Во время ознакомления с этим материалом я столкнулась с одной небольшой сложностью.
Напишем для примера такой класс:
public class Money {
    private int value;
    private String type;

    public Money(int v, String t){
        value = v;
        type = t;
    }

    public Money add(Money m){
        return new Money(value + m.getValue(), type);
    }

    public int getValue(){
        return value;
    }
    public Money div(Money m){
        return new Money(value / m.getValue(), type);
    }

Для тестирования создадим класс TestMoney:
import static org.junit.Assert.*;

import org.junit.*;
import test.Money;

public class TestMoney {

        Money m1;
        Money m2;
        Money expected;
        Money result;

        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
        }

        @AfterClass
        public static void tearDownAfterClass() throws Exception {
        }

        @Before
        public void setUp() throws Exception {
            m1 = new Money(12, "USD");
            m2 = new Money(14, "USD");
            expected = new Money(26, "USD");
            result = m1.add(m2);
        }

        @After
        public void tearDown() throws Exception {
        }

        @Test
        public void testAdd() {
            assertEquals(expected, result);
        }

Все казалось бы хорошо и логично, но тест фэйлится. Объекты expected и result - не равны. А дело вот в чем. Для сравнения объектов мы забыли переопределить методы equals() и hashCode(), и джава естественно не считает их одинаковыми. 
Чтобы исправить ситуацию, переопределим методы equals() и hashCode() для нашего класса Money:
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Money money = (Money) o;

        if (value != money.value) return false;
        if (!type.equals(money.type)) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = value;
        result = 31 * result + type.hashCode();
        return result;
    }

Теперь все работает, как и ожидалось. Подсказка - в Идее эти методы можно генерировать автоматически (Generate->equals() and hashCode()).


Еще полезные материалы - тут, и тут

Комментариев нет:

Отправить комментарий