Ответ
В 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); // И ожидаем, что всё будет охуенно
Вот и вся философия. Не надо тут изобретать велосипед, как Тургенев итальянскую сказку. Бери готовые подходы, не выёбывайся — и будет тебе счастье, а тесты — зелёные. Главное — токен не потеряй и не утопи, а то придётся, как Герасим, метаться и совестью маяться.