Настройка проекта
Тесты живут в том же проекте, что и проверяемый код. Чтобы Maven их запускал, нужны две вещи: библиотека JUnit в зависимостях и плагин Surefire, который находит тестовые классы и выполняет их на фазе test. Этот урок не учит Maven — только той части, что нужна для тестов.
Создание проекта
Подойдёт любой Maven-проект. Новый создаётся стандартным архетипом:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 \
-DgroupId=com.example -DartifactId=blog -Dpackage=com.example.blog \
-DinteractiveMode=false
cd blogАрхетип добавляет JUnit 5.11 и примеры App и AppTest — удалите оба класса и замените pom.xml версией ниже.
pom.xml
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>blog</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>25</maven.compiler.release>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>6.1.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.6.0</version>
</plugin>
</plugins>
</build>
</project>| Часть | Зачем нужна |
|---|---|
junit-bom | BOM (bill of materials, «спецификация») задаёт версии всех модулей JUnit в одном месте, поэтому у зависимостей ниже нет version |
junit-jupiter | API для написания тестов, параметризованные тесты и движок, который их запускает |
scope test | Библиотека доступна только тестам и не попадает в готовую программу |
maven-surefire-plugin | Запускает тесты; версия закреплена, чтобы сборка не зависела от умолчаний Maven |
Где лежит код
blog/
├── pom.xml
└── src/
├── main/java/com/example/shop/PriceCalculator.java код
└── test/java/com/example/shop/PriceCalculatorTest.java его тестТест лежит в src/test/java в том же пакете, что и проверяемый класс. Так он видит члены с пакетным доступом, а структура двух папок совпадает.
Тестируемый класс
Создайте src/main/java/com/example/shop/PriceCalculator.java:
// src/main/java/com/example/shop/PriceCalculator.java
package com.example.shop;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class PriceCalculator {
public BigDecimal total(BigDecimal price, int quantity) {
if (quantity <= 0) {
throw new IllegalArgumentException("Количество должно быть больше нуля: " + quantity);
}
return price.multiply(BigDecimal.valueOf(quantity))
.setScale(2, RoundingMode.HALF_UP);
}
public BigDecimal applyDiscount(BigDecimal amount, int percent) {
if (percent < 0 || percent > 100) {
throw new IllegalArgumentException("Скидка должна быть от 0 до 100: " + percent);
}
BigDecimal factor = BigDecimal.valueOf(100 - percent).movePointLeft(2);
return amount.multiply(factor).setScale(2, RoundingMode.HALF_UP);
}
}total() умножает цену на количество, applyDiscount() вычитает процент скидки. Оба метода округляют до центов. Выполните mvn test — Maven скачает JUnit и сообщит BUILD SUCCESS, тестов пока нет.
Частая ошибка
Если положить тест в src/main/java, проект перестанет компилироваться: из-за scope test JUnit доступен только коду в src/test/java.
[ERROR] /.../src/main/java/com/example/shop/WrongPlaceTest.java:[3,29] package org.junit.jupiter.api does not existПеренесите тестовый класс в src/test/java, сохранив пакет.