Ответ
В 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);