Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройка проекта

Тесты живут в том же проекте, что и проверяемый код. Чтобы 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-bomBOM (bill of materials, «спецификация») задаёт версии всех модулей JUnit в одном месте, поэтому у зависимостей ниже нет version
junit-jupiterAPI для написания тестов, параметризованные тесты и движок, который их запускает
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, сохранив пакет.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.