Написать код мало. Без его тестирования никуда. Один из популярных фрэймоворков для этих целей является 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()).
Комментариев нет:
Отправить комментарий