← Назад к вопросам

Что использовал при написании Unit тестов

2.2 Middle🔥 231 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инструменты и фреймворки для Unit тестов в Java

Основные фреймворки

JUnit — это самый распространённый фреймворк для написания unit тестов в Java. Существуют две основные версии:

JUnit 4:

import org.junit.Test;
import org.junit.Before;
import static org.junit.Assert.*;

public class CalculatorTest {
    private Calculator calculator;
    
    @Before
    public void setUp() {
        calculator = new Calculator();
    }
    
    @Test
    public void testAddition() {
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}

JUnit 5 (Jupiter):

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {
    private Calculator calculator;
    
    @BeforeEach
    public void setUp() {
        calculator = new Calculator();
    }
    
    @Test
    public void testAddition() {
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}

JUnit 5 имеет более модульную архитектуру и поддерживает параметризованные тесты.

Фреймворк Mockito для моков

Mockito используется для создания моков (mock объектов) при тестировании зависимостей:

import static org.mockito.Mockito.*;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
    
    @Mock
    private UserRepository userRepository;
    
    private UserService userService;
    
    @BeforeEach
    public void setUp() {
        userService = new UserService(userRepository);
    }
    
    @Test
    public void testGetUserById() {
        User user = new User(1L, "John");
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));
        
        User result = userService.getUserById(1L);
        
        assertEquals("John", result.getName());
        verify(userRepository).findById(1L);
    }
}

AssertJ для улучшенных проверок

AssertJ предоставляет более читаемый синтаксис для проверок утверждений:

import static org.assertj.core.api.Assertions.*;

public class ListTest {
    @Test
    public void testList() {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        
        assertThat(names)
            .hasSize(3)
            .contains("Alice")
            .doesNotContain("David")
            .allMatch(s -> s.length() > 0);
    }
}

Parameterized Tests (JUnit 5)

Для тестирования одной функции с разными параметрами:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class MathTest {
    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3, 5})
    public void testIsOdd(int number) {
        assertTrue(MathUtils.isOdd(number));
    }
}

TestNG (альтернатива JUnit)

TestNG — более мощный фреймворк с дополнительными возможностями:

import org.testng.annotations.*;
import static org.testng.Assert.*;

public class LoginTest {
    @BeforeClass
    public void setUp() {
        // Инициализация перед всеми тестами
    }
    
    @Test
    public void testValidLogin() {
        assertTrue(login("user", "password"));
    }
    
    @DataProvider(name = "loginData")
    public Object[][] getLoginData() {
        return new Object[][] {
            {"user1", "pass1", true},
            {"user2", "pass2", false}
        };
    }
    
    @Test(dataProvider = "loginData")
    public void testLoginWithData(String user, String pass, boolean expected) {
        assertEquals(login(user, pass), expected);
    }
}

Coverage инструменты

JaCoCo — для измерения покрытия кода тестами:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.8</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Примеры типичного использования

Полный пример с JUnit 5 и Mockito:

@ExtendWith(MockitoExtension.class)
public class OrderServiceTest {
    
    @Mock
    private OrderRepository orderRepository;
    
    @Mock
    private EmailService emailService;
    
    private OrderService orderService;
    
    @BeforeEach
    public void setUp() {
        orderService = new OrderService(orderRepository, emailService);
    }
    
    @Test
    public void testCreateOrder() {
        Order order = new Order(1L, "Product", 100);
        when(orderRepository.save(any())).thenReturn(order);
        
        Order result = orderService.createOrder(order);
        
        assertThat(result.getId()).isEqualTo(1L);
        verify(emailService).sendConfirmation(order);
    }
}

Лучшие практики

  • Назовите тесты понятно: testCreateOrder_WhenDataIsValid_ThenReturnsSavedOrder()
  • Используйте AAA паттерн (Arrange-Act-Assert)
  • Один assert на тест или используйте AssertJ для нескольких связанных проверок
  • Изолируйте тесты — каждый тест должен быть независимым
  • Тестируйте граничные случаи (null, пустые коллекции, отрицательные значения)
  • Мокируйте внешние зависимости (БД, API, сервисы)
Что использовал при написании Unit тестов | PrepBro