Как настроить авторизацию для тестов в JUnit?

Ответ

В JUnit авторизацию для тестов API настраивают, предварительно получая токен или учётные данные и передавая их в заголовках запросов. Основные подходы:

1. Использование @BeforeEach / @BeforeAll для настройки

Логика получения токена выполняется один раз перед всеми или каждым тестом.

import org.junit.jupiter.api.*;
import java.net.http.*;
import java.net.URI;

public class AuthorizedApiTest {
    private static String authToken;
    private HttpClient client;

    @BeforeAll
    static void obtainGlobalToken() throws Exception {
        // Получаем токен для всех тестов класса
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/login"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(
                        "{"username":"test","password":"secret"}"))
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        // Извлекаем токен из ответа (зависит от формата API)
        authToken = "Bearer " + parseTokenFromJson(response.body());
    }

    @BeforeEach
    void setupClient() {
        client = HttpClient.newHttpClient();
    }

    @Test
    void testGetProtectedResource() throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/protected/data"))
                .header("Authorization", authToken) // Используем заранее полученный токен
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        Assertions.assertEquals(200, response.statusCode());
    }
}

2. Распространённые методы авторизации в тестах:

  • Bearer Token: header("Authorization", "Bearer <token>")
  • Basic Auth: header("Authorization", "Basic " + Base64.getEncoder().encodeToString("user:pass".getBytes()))
  • API Key: header("X-API-Key", "your-api-key")
  • Cookies: Могут быть установлены после запроса на логин и автоматически передаваться клиентом в последующих запросах.

3. Использование библиотек для удобства

Для сложных сценариев (OAuth) используйте библиотеки, такие как RestAssured, которые упрощают добавление заголовков и аутентификацию.

given()
    .header("Authorization", "Bearer " + token)
    .when()
    .get("/api/resource")
    .then()
    .statusCode(200);

Ответ 18+ 🔞

Да ты посмотри, как эти разработчики с авторизацией в тестах API извращаются! Прямо как Герасим с Муму, блядь — либо всё, либо нихуя. Ну, слушай сюда, сейчас разложу по полочкам, как не обосраться с этим делом.

Основная идея-то проще, чем кажется, ёпта. Надо просто перед тестами взять этот ёбанный токен и тыкать его в каждый запрос. А делают это обычно в @BeforeEach или @BeforeAll. Смотри, как это выглядит, если не выёбываться:

import org.junit.jupiter.api.*;
import java.net.http.*;
import java.net.URI;

public class AuthorizedApiTest {
    private static String authToken; // Вот он, наш спаситель, как Муму для Герасима
    private HttpClient client;

    @BeforeAll
    static void obtainGlobalToken() throws Exception {
        // Лезем на эндпоинт логина, как последние извращенцы
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/login"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(
                        "{"username":"test","password":"secret"}"))
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        // Выковыриваем токен из ответа — тут уж как API захочет, блядь
        authToken = "Bearer " + parseTokenFromJson(response.body());
    }

    @BeforeEach
    void setupClient() {
        client = HttpClient.newHttpClient(); // Новый клиент на каждый тест — чистота, блядь!
    }

    @Test
    void testGetProtectedResource() throws Exception {
        // А вот и сам запрос, куда мы суём наш заранее добытый токен
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/protected/data"))
                .header("Authorization", authToken) // Магия здесь, ёпта!
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        Assertions.assertEquals(200, response.statusCode()); // Ждём зелёного света, как манны небесной
    }
}

Суть в чём, блядь? Токен получаем один раз — и потом таскаем его с собой, как Герасим таскал бы Муму, если бы не был ебанутым максималистом. Главное — не утопить его случайно в пизду, то есть в логике тестов.

А как вообще авторизоваться-то можно, спросишь ты? Да вариантов — овердохуища!

  • Bearer Token: Самый модный, пацанский. Просто лепишь в заголовок "Bearer <ваш_токен_тут>" и вперёд.
  • Basic Auth: Старая, добрая, как дедовский метод. Закодируешь "user:pass" в Base64 и в заголовок суёшь. Проще пареной репы, блядь.
  • API Key: Как ключ от квартиры, где деньги лежат. Обычно в кастомный заголовок типа X-API-Key пихают.
  • Cookies: Автоматическая магия. Залогинился — тебе печеньку дали. Клиент её сам в следующие запросы подкладывает. Удобно, но иногда непредсказуемо, как сука.

А если тебе всё это влом через голый HttpClient городить — есть же библиотеки! RestAssured, например. Это вообще песня, блядь. Смотри, как элегантно:

given()
    .header("Authorization", "Bearer " + token) // Всё то же самое, но в стиле "чё, как дела"
    .when()
    .get("/api/resource")
    .then()
    .statusCode(200); // И ожидаем, что всё будет охуенно

Вот и вся философия. Не надо тут изобретать велосипед, как Тургенев итальянскую сказку. Бери готовые подходы, не выёбывайся — и будет тебе счастье, а тесты — зелёные. Главное — токен не потеряй и не утопи, а то придётся, как Герасим, метаться и совестью маяться.