← Назад к вопросам
Что использовал при написании 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, сервисы)