В системах программирования на языке Java, в том числе Java Eclipse, введены средства тестирования, которые предусматривают создание и использование автоматических тестов для разработанных программ. Правильно построенное тестирование позволяет свести количество ошибок в программе к нулю.
При разработке современных программных систем популярна методология TDD (Test Driven Development). Основная идея применения TDD заключается в том, что сначала разрабатываются тесты на желаемое поведение программы (системы), а затем пишется рабочий программный код, который с помощью средств рефакторинга проверяется уже созданными тестами. Как следствие, заранее подготовленные тесты позволяют избежать сдачи в эксплуатацию программы, содержащей ошибки.
Для проведения тестирования в Java Eclipse применяется так называемое JUnit-тестирование, которое является фактическим стандартом для тестирования Java-приложений. JUnit — это обычная среда (framework), позволяющая писать тесты в виде классов Java. Эти классы могут запускаться как единое целое с помощью средства выполнения тестов.
Как создать и запустить простой JUnit тест? Что такое JUnit и как работает юнит-тестирование в Java?
JUnit имеет много расширений, которые внедрены во всех современных средах разработки на языке Java. На сегодняшний день JUnit используется в таких направлениях как:
- модульное тестирование;
- тестирование веб-сайтов;
- автоматическая подстановка интерфейсов для тестирования;
- тестирование параллельного выполнения приложений;
- тестирование производительности.
JUnit-тестирование используется многими группами тестировщиков (quality assurance) на специально-разработанных веб-сайтах, обеспечивающих автоматизацию применения сквозных функциональных тестов.
В Java Eclipse использование механизма JUnit не требует работающего сервера приложений или действующей базы данных.
2. Понятие тестового примера ( Test Case ). Класс, содержащий тестовые примеры (методы). Запуск теста
При использовании механизма JUnit, рассматриваются две основные единицы (классы):
- класс, методы которого нужно протестировать;
- класс, который представляет собой JUnit тест. Этот класс построен по специальным правилам.
Значит, JUnit-тест представляет собой специально разработанный класс, содержащий методы, которые тестируют программный код других классов. В системе Java Eclipse этот класс создается с помощью команды JUnit Test Case (смотрите примеры далее).
Класс содержит ряд методов. Каждый из методов тестирующего класса рассматривается как отдельный тестовый пример — Test Case .
Тестовые примеры (методы) JUnit-класса могут быть объявлены с использованием следующих аннотаций (рассматривается версия Java Eclipse 2018-09):
Допускается произвольное количество методов со всеми вышеприведенными аннотациями.
В наиболее общем случае, примерный вид класса, сгенерированный системой Java Eclipse, может быть таким
В методе testMethod() нужно вставить собственный код работы методов другого класса (смотрите примеры ниже). После этого, можно запускать тест с помощью специальной команды Java Eclipse.
Модульное тестирование / Unit Testing в Java: Создание первого теста
3. Пример, демонстрирующий использование JUnit для проверки правильности решения квадратного уравнения. Пошаговая инструкция
3.1. Условие задачи
Используя технологию JUnit разработать Unit-тест для проверки работы класса SquareEquation , который содержит средства решения квадратного уравнения.
Тест должен размещаться в классе SquareEquationTest и содержать соответствующие методы проверки правильности полученного решения.
Корни квадратного уравнения возвращаются в виде экземпляра класса Roots .
Класс SquareEquationTest содержит соответствующие средства решения квадратного уравнения.
3.2. Решение
3.2.1. Создание классов SquareEquation и Roots
Перед созданием классов создается проект стандартным для Java Eclipse способом. В проект добавляются два класса с именами SquareEquation и Roots и формируется код этих классов. Соответственно создается файл SquareEquation.java . После выполненных действий, окно Java Eclipse имеет вид как показано на рисунке 1.
Рисунок 1. Окно Java Eclipse. Классы Roots и SquareEquation
Классы имеют следующее назначение:
- Roots — используется для сохранения корней квадратного уравнения (x1, x2) в случае, если уравнение имеет эти корни;
- SquareEquation — реализует методы решения квадратного уравнения.
- Класс SquareEquation имеет следующие составляющие:
- внутренние переменные a , b , c что являются коэффициентами квадратного уравнения;
- конструктор, инициализирует значения внутренних полей a , b , c ;
- метод Solution() , который возвращает экземпляр класса Roots в случае, если уравнение имеет корни. Если уравнение не имеет корней, то генерируется исключение типа ArithmeticException .
Полный текст классов Roots и SquareEquation выглядит так
// Корни уравнения class Roots < public double x1; public double x2; > // Класс, решающий квадратное уравнение — этот класс будет протестирован другим классом. // a*x^2 + b*x + c = 0 public class SquareEquation < // Коэффициенты уравнения private double a, b, c; // Конструктор public SquareEquation(double a, double b, double c) < this.
a = a; this.b = b; this.
c = c; > // Метод, решающий квадратное уравнение public Roots Solution() < // Дискриминант double d = b*b — 4*a*c; // Проверка, имеет ли уравнение корни if (d<0) throw new ArithmeticException(«Solution has no roots.»); // Вычислить результат Roots result = new Roots(); result.x1 = (-b — Math.
sqrt(d)) / (2*a); result.x2 = (-b + Math.sqrt(d)) / (2*a); // Вернуть результат return result; > >
После создания классов можно переходить к созданию Unit-теста.
3.2.2. Создание класса, необходимого для реализации JUnit тестирования
Для создания Unit-теста в Java Eclipse нужно выбрать последовательность команд
File->New->JUnit Test Case
как показано на рисунке 2.
Рисунок 2. Команда создания Unit-теста в Java
В результате откроется окно «New JUnit Test Case» (рисунок 3) в котором нужно указать необходимую информацию о тесте.
Рисунок 3. Окно создания нового теста. Указание параметров теста
При создании окна система автоматически заполнит некоторые поля. В окне указывается следующая информация.
- В поле «Class under test:» указывается имя класса SquareEquation , методы которого нужно протестировать.
- Дополнительно задаются другие опции:
- выбор модели тестирования «New JUnit Jupiter test» ;
- возможность добавления комментариев;
- другое.
В нашем случае можно оставить все без изменений.
Рисунок 4. Выбор методов которые будут тестироваться. Выбран метод Solution()
3.2.3. Код класса SquareEquationTest
После создания JUnit теста с помощью оконного интерфейса Java Eclipse сгенерирует код класса SquareEquationTest
В этом коде сформированы два метода:
3.2.4. Модификация класса SquareEquationTest . Программирование теста
Чтобы протестировать работу класса SquareEquation нужно создать экземпляр этого класса. Поэтому, в текст класса SquareEquationTest дополнительно вводится ссылка на класс SquareEquation
class SquareEquationTest < private SquareEquation se; . >
Затем в методе setUp() создается экземпляр класса SquareEquation , на который указывает ссылка se
После этого, в методе TestSolution() вписывается код проверки правильности полученного решения для заданных коэффициентов
a = 2 b = 1 c = -3
в экземпляре se
Проверка решения осуществляется с помощью перегруженного метода assertEquals() класса org.junit.jupiter.api.Assertions . Происходит сравнение решения в переменных rt.x1 и rt.x2 с заранее вычисленным (вручную) решением текущего варианта (a = 2, b = 1, c = -3) квадратного уравнения. Если есть совпадение, то решение правильное. О том, что решение правильное, нужна сказать система после запуска теста (следующий пункт).
В целом текст всего модуля тестирования следующий
3.3. Запуск теста средствами Java Eclipse. Просмотр результата тестирования
После того, как сформирован код класса SquareEquationTest , разработанный тест можно запускать на выполнение. Это осуществляется командами
Run -> Run As -> JUnit Test
или вызовом последовательности комбинаций клавиш Alt + Shift + X, T как показано на рисунке 5.
Рисунок 5. Запуск JUnit-теста
Существует другой способ с помощью команды быстрого меню (рисунок 6).
Рисунок 6. Команда запуска JUnit-теста
После запуска в левой части Java Eclipse в окне JUnit отобразится результат тестирования (рисунок 7).
Рисунок 7. Результат тестирования
Как видно из результата, получено подтверждение правильного решения, то есть тест сдан. Значит, метод Solution() класса SquareEquation дает правильный результат для случая когда a = 2, b = 1, c = -3.
Если в методе TestSolution() при вызове assertEquals() специально указать неверный ответ, например
assertEquals(rt.x2, 777.777);
то после повторного запуска теста, в окне JUnit отобразится ошибка как видно на рисунке 8. Хотя это не ошибка программы, а умышленная ошибка в тесте.
Рисунок 8. Демонстрация провала теста
4. Пример, демонстрирующий последовательность вызова методов в JUnit-тесте
Пусть в системе Java Eclipse создан класс с именем TestClass для проведения тестирования некоторого другого класса. В данном примере, суть тестируемого класса не имеет значения.
Программный код класса следующий
После запуска теста на выполнение, программа выдаст следующий результат
BeforeAll BeforeAll2 BeforeEach2 BeforeEach Test AfterEach BeforeEach2 BeforeEach Test2 AfterEach AfterAll
Связанные темы
Источник: www.bestprog.net
Тестирование в Java. JUnit
Сегодня все большую популярность приобретает test-driven development(TDD), техника разработки ПО, при которой сначала пишется тест на определенный функционал, а затем пишется реализация этого функционала. На практике все, конечно же, не настолько идеально, но в результате код не только написан и протестирован, но тесты как бы неявно задают требования к функционалу, а также показывают пример использования этого функционала.
Итак, техника довольно понятна, но встает вопрос, что использовать для написания этих самых тестов? В этой и других статьях я хотел бы поделиться своим опытом в использовании различных инструментов и техник для тестирования кода в Java.
Ну и начну с, пожалуй, самого известного, а потому и самого используемого фреймворка для тестирования — JUnit. Используется он в двух вариантах JUnit 3 и JUnit 4. Рассмотрю обе версии, так как в старых проектах до сих пор используется 3-я, которая поддерживает Java 1.4.
Я не претендую на автора каких-либо оригинальных идей, и возможно многим все, о чем будет рассказано в статье, знакомо. Но если вам все еще интересно, то добро пожаловать под кат.
JUnit 3
Для создания теста нужно унаследовать тест-класс от TestCase, переопределить методы setUp и tearDown если надо, ну и самое главное — создать тестовые методы(должны начинаться с test). При запуске теста сначала создается экземляр тест-класса(для каждого теста в классе отдельный экземпляр класса), затем выполняется метод setUp, запускается сам тест, ну и в завершение выполняется метод tearDown. Если какой-либо из методов выбрасывает исключение, тест считается провалившимся.
Примечание: тестовые методы должны быть public void, могут быть static.
Сами тесты состоят из выполнения некоторого кода и проверок. Проверки чаще всего выполняются с помощью класса Assert хотя иногда используют ключевое слово assert.
Рассмотрим пример. Есть утилита для работы со строками, есть методы для проверки пустой строки и представления последовательности байт в виде 16-ричной строки:
public abstract class StringUtils < private static final int HI_BYTE_MASK = 0xf0; private static final int LOW_BYTE_MASK = 0x0f; private static final char[] HEX_SYMBOLS = < ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, >; public static boolean isEmpty(final CharSequence sequence) < return sequence == null || sequence.length() public static String toHexString(final byte[] data) < final StringBuffer builder = new StringBuffer(2 * data.length); for (byte item : data) < builder.append(HEX_SYMBOLS[(HI_BYTE_MASK >> 4]); builder.append(HEX_SYMBOLS[(LOW_BYTE_MASK > return builder.toString(); > >
Напишем для нее тесты, используя JUnit 3. Удобнее всего, на мой взгляд, писать тесты, рассматривая нейкий класс как черный ящик, писать отдельный тест на каждый значимый метод в этом классе, для каждого набора входных параметров какой-то ожидаемый результат. Например, тест для isEmpty метода:
public void testIsEmpty()
Можно разделить данные и логику теста, перенеся создание данных в метод setUp:
public class StringUtilsJUnit3Test extends TestCase < private final Map toHexStringData = new HashMap(); protected void setUp() throws Exception < toHexStringData.put(«», new byte[0]); toHexStringData.put(«01020d112d7f», new byte[] < 1, 2, 13, 17, 45, 127 >); toHexStringData.put(«00fff21180», new byte[] < 0, -1, -14, 17, -128 >); //. > protected void tearDown() throws Exception < toHexStringData.clear(); >public void testToHexString() < for (Iterator iterator = toHexStringData.keySet().iterator(); iterator.hasNext();) < final String expected = (String) iterator.next(); final byte[] testData = (byte[]) toHexStringData.get(expected); final String actual = StringUtils.toHexString(testData); assertEquals(expected, actual); >> //. >
Дополнительные возможности
Кроме того, что было описано, есть еще несколько дополнительных возможностей. Например, можно группировать тесты. Для этого нужно использовать класс TestSuite:
public class StringUtilsJUnit3TestSuite extends TestSuite < public StringUtilsJUnit3TestSuite() < addTestSuite(StringUtilsJUnit3Test.class); addTestSuite(OtherTest1.class); addTestSuite(OtherTest2.class); >>
Можно запустить один и тот же тест несколько раз. Для этого используем RepeatedTest:
public class StringUtilsJUnit3RepeatedTest extends RepeatedTest < public StringUtilsJUnit3RepeatedTest() < super(new StringUtilsJUnit3Test(), 100); >>
Наследуя тест-класс от ExceptionTestCase, можно проверить что-либо на выброс исключения:
public class StringUtilsJUnit3ExceptionTest extends ExceptionTestCase < public StringUtilsJUnit3ExceptionTest(final String name) < super(name, NullPointerException.class); >public void testToHexString() < StringUtils.toHexString(null); >>
Как видно из примеров все довольно просто, ничего лишнего, минимум нужный для тестирования(хотя недостает и некоторых нужных вещей).
JUnit 4
Здесь была добавлена поддержка новых возможностей из Java 5, тесты теперь могут быть объявлены с помощью аннотаций. При этом существует обратная совместимость с предыдущей версией фреймворка, практически все рассмотренные выше примеры будут работать и здесь(за исключением RepeatedTest, его нет в новой версии).
Итак, что же поменялось?
Основные аннотации
Рассмотрим тот же пример, но уже используя новые возможности:
Правила
Кроме всего вышеперечисленного есть довольно интересная вещь — правила. Правила это некое подобие утилит для тестов, которые добавляют функционал до и после выполнения теста.
Например, есть встроенные правила для задания таймаута для теста(Timeout), для задания ожидаемых исключений(ExpectedException), для работы с временными файлами(TemporaryFolder) и д.р. Для объявления правила необходимо создать public не static поле типа производного от MethodRule и зааннотировать его с помощью Rule.
Также в сети можно найти и другие варианты использования. Например, здесь рассмотрена возможность параллельного запуска теста.
Запускалки
JUnit4 — запускалка по умолчанию, как понятно из названия, предназначена для запуска JUnit 4 тестов.
JUnit38ClassRunner предназначен для запуска тестов, написанных с использованием JUnit 3.
SuiteMethod либо AllTests тоже предназначены для запуска JUnit 3 тестов. В отличие от предыдущей запускалки, в эту передается класс со статическим методом suite возвращающим тест(последовательность всех тестов).
Enclosed — то же, что и предыдущий вариант, но вместо настройки с помощью аннотации используются все внутренние классы.
Parameterized — довольно интересная запускалка, позволяет писать параметризированные тесты. Для этого в тест-классе объявляется статический метод возвращающий список данных, которые затем будут использованы в качестве аргументов конструктора класса.
Как и в случае с правилами, в сети можно найти и другие варианты использования. Например, здесь рассмотрена та же возможность паралельного запуска теста, но с использованием запускалок.
Вывод
Это, конечно же, не все, что можно было сказать по JUnit-у, но я старался вкратце и по делу. Как видно, фреймворк достаточно прост в использовании, дополнительных возможностей немного, но есть возможность расширения с помощью правил и запускалок. Но несмотря на все это я все же предпочитаю TestNG с его мощным функционалом, о котором и расскажу в следующей статье.
Примеры можно найти на гитхабе.
Литература
Источник: habr.com
JUnit part I
Кратко о том, зачем этот зверь нам нужен? JUnit — это фреймворк автоматического тестирования вашего хорошего или не совсем хорошего кода. Можно сказать: — зачем мне эти качели, я и так смогу легко, и просто протестировать свой хороший Java код. Можно много писать вступительной лирики, но поэт из меня никакой, перейдём лучше к делу…
Создаем объект
- Нам нужен объект, который будет хранить информацию о Пользователе.
- Id — нужно считать по порядку добавления нового пользователя.
- Имя пользователя.
- Его возраст.
- Пол (male/female)
- Формировать список всех пользователей.
- Формировать список пользователей по полу (MALE/FEMALE).
- Возвращать количество пользователей в общем списке, и посчитать количество по признаку пола пользователя.
- Посчитать общую сумму по возрасту пользователей, так же учесть по признаку пола.
- Посчитать средний возраст, как общий так и по признаку пола.
private int id; private String name; private int age; private Sex sex;
Для хранения данных о пользователе этого достаточно, посмотрим что там еще нужно по задаче. Нам нужно как-то хранить всех пользователей, сделаем в нашем классе статическое поле allUsers , думаю нормально если это будет Map
private static Map allUsers;
Еще нам как-то нужно присваивать порядковый номер пользователям, создадим статическое поле счетчик, который при создании нового пользователя, будет присваивать порядковый Id пользователю.
private static int countId = 0;
Так, с полями вроде разобрались, напишем конструктор для нашего объекта, и гетеры для полей id , name , age , sex . C гетерами там ничего сложного нет, попросим помощи у IDEA, она никогда не откажет, а конструктор сделаем немного с хитростью. Конструктор будет уметь.
Инициализировать поля, проверять есть ли такой объект в allUsers , если такого объекта нет, то увеличиваем наш счетчик countId++ , и добавляем его в список всех пользователей. А так же инициализировать поле allUsers ели оно еще не было инициализировано. Для удобства поиска одинаковых объектов, переопределим методы equals() и hashCode() , опять попросим помощи у любимой IDEA и будем сравнивать по полям name , age , sex . Плюс создадим приватный метод hasUser() , который будет проверять есть ли такой объект в списке.
Конструктор в итоге у меня получился такой.
public User(String name, int age, Sex sex) < if (allUsers == null)< allUsers = new HashMap<>(); > this.name = name; this.age = age; this.sex = sex; if (!hasUser()) < countId++; this.id = countId; allUsers.put(id, this); >>
и вспомогательный приватный метод
private boolean hasUser() < for (User user : allUsers.values())< if (user.equals(this) user.hashCode() == this.hashCode())< return true; >> return false; >
а также переопределим toString()
public static int getHowManyUsers() < return allUsers.size(); >public static int getHowManyUsers(Sex sex)
public static int getAllAgeUsers() < int countAge = 0; for (User user : allUsers.values())< countAge += user.age; >return countAge; > public static int getAllAgeUsers(Sex sex) < int countAge = 0; for (User user : getAllUsers(sex))< countAge += user.age; >return countAge; >
public static int getAverageAgeOfAllUsers() < return getAllAgeUsers() / getHowManyUsers(); >public static int getAverageAgeOfAllUsers(Sex sex) < return getAllAgeUsers(sex) / getHowManyUsers(sex); >
Отлично, требуемый объект и его поведение мы описали. Теперь можно переходить к JUnit, но для начала покажу как примерно будет выглядеть простой тест если мы его будет делать в main.
public static void main(String[] args) < new User(«Евгений», 35, Sex.MALE); new User(«Марина», 34, Sex.FEMALE); new User(«Алина», 7, Sex.FEMALE); System.out.println(«Все пользователи:»); User.getAllUsers().forEach(System.out::println); System.out.println(«Все пользователи: MALE»); User.getAllUsers(Sex.MALE).forEach(System.out::println); System.out.println(«Все пользователи: FEMALE»); User.getAllUsers(Sex.FEMALE).forEach(System.out::println); System.out.println(«================================================»); System.out.println(» всех пользователей: » + User.getHowManyUsers()); System.out.println(» всех пользователей MALE: » + User.getHowManyUsers(Sex.MALE)); System.out.println(«всех пользователей FEMALE: » + User.getHowManyUsers(Sex.FEMALE)); System.out.println(«================================================»); System.out.println(» общий возраст всех пользователей: » + User.getAllAgeUsers()); System.out.println(» общий возраст всех пользователей MALE: » + User.getAllAgeUsers(Sex.MALE)); System.out.println(«общий возраст всех пользователей FEMALE: » + User.getAllAgeUsers(Sex.FEMALE)); System.out.println(«================================================»); System.out.println(» средний возраст всех пользователей: » + User.getAverageAgeOfAllUsers()); System.out.println(» средний возраст всех пользователей MALE: » + User.getAverageAgeOfAllUsers(Sex.MALE)); System.out.println(«средний возраст всех пользователей FEMALE: » + User.getAverageAgeOfAllUsers(Sex.FEMALE)); System.out.println(«=============================================== lang-java line-numbers»> //output Все пользователи: User User User Все пользователи: MALE User Все пользователи: FEMALE User User ================================================ всех пользователей: 3 всех пользователей MALE: 1 всех пользователей FEMALE: 2 ================================================ общий возраст всех пользователей: 76 общий возраст всех пользователей MALE: 35 общий возраст всех пользователей FEMALE: 41 ================================================ средний возраст всех пользователей: 25 средний возраст всех пользователей MALE: 35 средний возраст всех пользователей FEMALE: 20 ================================================ Process finished with exit code 0
Как подключить JUnit к проекту
Возникает вопрос, как его подключить к проекту. Для знающих вариант с Mavenбрать не буду, так как это совсем другая история. 😉 Открываем структуру проекта Ctrl + Alt + Shift + S -> Libraries -> жмем + (New Project Library) -> выбираем from Maven дальше видим такое окно, в строку поиска вводим “ junit:junit:4.12 ” ждем пока найдет -> OK! -> OK!
Должен получиться такой результат
Жмем OK, поздравлю JUnit добавлен к проекту. Едем дальше. Теперь нам нужно создать тесты для нашего Java класса, ставим курсор на название класса User -> жмем Alt + Enter -> выбираем create Test. Мы должны увидеть окно, в котором нам нужно выбрать библиотеку JUnit4 -> выбрать методы которые собираемся тестировать -> OK
Идея сама создаст класс UserTest , это и есть класс, в котором мы будем покрывать наш код тестами. Приступим:
Тут мы создаем несколько тестовых пользователей -> создаем список expected в который поместим пользователей которых нам вернет метод getAllUsers() -> создадим список actual в который поместим пользователей которых мы предполагаем что метод getAllUsers() Assert.assertEquals(actual, expected) ему мы и передадим списки, инспектируемый и актуальный. Этот метод проверит объекты в предоставленных списках и выдаст результат теста. Метод будет сравнивать все поля объектов, даже пройдется по полям родителей, если есть наследование. Запускаем первый тест. Тест выполнен успешно. Теперь попробуем сделать так, чтобы тест был провален, для этого нам нужно изменить один из списков теста, сделаем это путем, закомментировав добавление одного пользователя в список actual ,
запускаем тест и видим следующее: Теперь мы можем немного разобрать причину провала теста. Тут мы видим, что в инспектируемом списке больше пользователей чем в актуальном. Это и есть причина провала. А в main мы можем проверить так? JUnit : main = 1 : 0. Давайте посмотрим как будет выглядеть тест, если в нем будут полностью разные объекты, сделаем это так:
вот что будет в консоли: тут сразу видно что в сравниваемых списках разные пользователи, еще мы можем кликнуть на получим такое окно, где можно посмотреть подробно с какими данными у нас проблема. IDEA подсветит все поля в которых есть различия. main такое может? — нет. JUnit : main = 2 : 0 Ну что, пойдем дальше у нас еще куча методов, которые нужно покрыть тестами ), но подождите, а ведь будет не плохо, проверить, а не будет ли нам метод getAllUsers() возвращать null , ведь примерно так нас на задачах JavaRush ловит валидатор ). Сделаем это, делов то на три копейки …
Да, да примерно так валидатор ловит наш говно код на null 😉 Теперь запустим этот тест, и посмотрим, что он нам покажет. А покажет он ошибку, как . как же тут можно было допустить ошибку теста))) И тут мы можем пожинать первые плоды покрытия своего кода тестами. Как вы помните, поле allUsers мы инициализировали в конструкторе, и значит при вызове метода getAllUsers() , мы обратимся к объекту, который еще не был инициализирован. Будем править, уберем инициализацию из конструктора, и сделаем ее при объявлении поля.
private static Map allUsers = new HashMap<>(); public User(String name, int age, Sex sex) < this.name = name; this.age = age; this.sex = sex; if (!hasUser()) < countId++; this.id = countId; allUsers.put(id, this); >>
Запустим тест, теперь все хорошо. не думаю что в main легко будет отловить NPE, думаю вы согласитесь что счет JUnit : main = 3 : 0 Дальше я все методы покрою тестами, и дам вам посмотреть, как это будет выглядеть. Теперь класс тестов у нас выглядит так:
Ну как вам, уже веселее и легче читать 😉 Вот список аннотаций для JUnit с ними однозначно жить проще.
Основные методы класса Assert для проверки:
Вот так мы можем добавить зависимость JUnit 4.12 в Maven
junit junit 4.12 test
Источник: javarush.com