Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #65, АПРЕЛЬ 2006 г.

красное затмение

БОРИС ВОЛЬФСОН

Спецвыпуск: Хакер, номер #065, стр. 065-048-4


public class QuadricRoots {

public QuadricRoots() {

}

public double[] FindRoots(double a, double b, double c) {

}

return null;

}

}

Теперь необходимо запустить тест. Двинемся в меню Run-> Run As-> JUnit Test либо нажмем аккорд <Alt>+<Shift>+<T>, затем <X>. В результате запускается система JUnit, которая встроена в Eclipse в виде плагина, и показывается знаменитая «зеленая полоса» JUnit, которая означает, что все тесты прошли успешно.

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

public void testOneRoot()

{

QuadricRoots quadricRoots = new QuadricRoots();

double[] answer = {-1.0};

double[] result = {-1.0};

assertEquals(answer[0], quadricRoots.FindRoots(1, 2, 1)[0], 0);

}

Для хранения правильного ответа я завел массив answer. Массив result остался в результате экспериментов и нигде не используется, но Eclipse тут же подчеркивает желтым все неиспользуемые переменные, поэтому они удаляются при помощи Quick Fix.

Кроме того, я сменил имя предыдущего теста на testNoRoots, что можно сделать при помощи меню Refactor-Rename (но в данном случае не даст никакого выигрыша). Запускаем тесты — полоска краснеет. Щелкаем по неудавшемуся тесту — и среда ставит курсор на нужную строчку. Как и ожидалось, не прошел тест с одним корнем. Соответственно, пора реализовать эту функциональность или просто сразу написать второй тест. Подход, который я описал только что, называют триангуляцией. Кстати, прежде чем писать третий тест, обратим внимание на появившееся дублирование кода в тестах и устраним его. Дело в том, что строчка QuadricRoots quadricRoots = new QuadricRoots(), находится сразу в двух методах. Необходимо создать поле quadricRoots, поэтому воспользуемся рефакторингом Convert Local Variable to Field. Притом это должно быть проделано в методе setUp, для того чтобы поля инициализировалось перед каждым тестом. Заодно напишем и третий тест:

public class QuadricRootsTests extends TestCase {

private QuadricRoots quadricRoots;

protected void setUp() throws Exception {

super.setUp();

quadricRoots = new QuadricRoots();

}

public void testNoRoots()

{

assertEquals(null, quadricRoots.FindRoots(1, 1, 100));

}

public void testOneRoot()

{

double[] answer = {-1.0};

assertEquals(answer[0], quadricRoots.FindRoots(1, 2, 1)[0], 0);

}

public void testTwoRoots()

{

double[] answer = {-4.0, 1.0};

double[] result = quadricRoots.FindRoots(1, 3, -4);

assertEquals(answer[0], result[0], 0);

assertEquals(answer[1], result[1], 0);

}

}

Теперь просто реализуем метод FindRoots:

public double[] FindRoots(double a, double b, double c) {

double[] result = null;

double d = b * b — 4 * a * c;

if (d == 0) {

result = new double[1];

Назад на стр. 065-048-3  Содержание  Вперед на стр. 065-048-5