красное затмение БОРИС ВОЛЬФСОН Спецвыпуск: Хакер, номер #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]; |