class AppTest {
private static Javalin app;
private static String baseUrl;
private static Transaction transaction;
// Метод выполнится перед всеми тестами в классе
@BeforeAll
public static void beforeAll() {
// Получаем инстанс приложения
app = App.getApp();
// Запускаем приложение на рандомном порту
app.start(0);
// Получаем порт, на которм запустилось приложение
int port = app.port();
// Формируем базовый URL
baseUrl = "http://localhost:" + port;
}
// Метод выполнится после окончания всех тестов в классе
@AfterAll
public static void afterAll() {
// Останавливаем приложение
app.stop();
}
@Test
void testSonething() {
// Выполняем POST запрос при помощи агента Unirest
HttpResponse<String> responsePost = Unirest
// POST запрос на URL
.post(baseUrl + "/companies")
// Устанавливаем значения полей
.field("name", "Google")
.field("anotherField", "another value")
// Выполняем запрос и получаем тело ответ с телом в виде строки
.asString();
// Проверяем статус ответа
assertThat(responsePost.getStatus()).isEqualTo(302);
// Проверяем, что компания добавлена в БД
User actualCompany = new QCompany()
.name.equalTo("Google")
.findOne();
assertThat(actualCompany).isNotNull();
// И что её данные соответствуют переданным
assertThat(actualUser.getName()).isEqualTo("Google");
assertThat(actualUser.getAnotherField()).isEqualTo("another valeu");
// Можно проверить, что такой компании нет в БД
assertThat(actualCompany).isNull();
// Так можно получить содержимое тела ответа
String content = responsePost.getBody();
// И проверить, что оно содержит определённую строку
assertThat(content).contains("yandex.ru");
}
}
При тестировании возникают такие ситуации, что нужно проверить работу метода, выполняющего HTTP-запрос. Предположим, что у нас есть метод App.getTitle()
, который выполняет запрос на переданный url и анализирует данные полученной страницы. Например, получает заголовок этой страницы. Давайте его протестируем. Мы хотим убедиться, что метод работает правильно – анализирует полученную информацию и возвращает результат. Идеальный тест выглядел бы так:
class AppTest {
@Test
void testSomething() {
var url = "http://example.com/";
var title = App.getTitle(url);
assertThat(title).isEqualTo("Example title");
}
}
Но внутри метода App.getTitle()
выполняется HTTP-запрос. Из-за этого могут возникнуть следующие проблемы:
В данном примере HTTP-запрос воспринимается как помеха к тому, чтобы протестировать нашу основную логику. Мы доверяем библиотеке, которая выполняет запросы внутри нашего метода App.getTitle()
, нам не нужно проверять, что она работает правильно.
Чтобы выйти из этой ситуации, в Java есть библиотека MockWebServer, которая имитирует поведение реального удаленного сервера, но не выполняет реальные запросы через Интернет.
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.MockResponse;
class AppTest {
private static MockWebServer mockServer;
@BeforeAll
public static void beforeAll() {
// Создаем новый экземпляр MockWebServer
mockServer = new MockWebServer();
// Создаём инстанс MockResponse, и устанавливаем нужное тело ответа
// Это и есть та фейковая страница, а точнее её содержимое (html),
// с которой будет работать наш метод в тестах
MockResponse mockedResponse = new MockResponse()
.setBody(readFixture("index.html"));
// Добавляем инстанс MockResponse в очередь к созданному серверу
mockServer.enqueue(mockedResponse);
// Запускаем сервер
mockServer.start();
}
@AfterAll
public static void afterAll() {
// После выполнения тестов нужно остановить сервер
mockServer.shutdown();
}
@Test
void testGetHeader() {
// Вызвав на созданном инстансе сервера метод mockServer.url("/").toString(),
// можно получить адрес сайта, который нужно будет использовать в тестах
String url = mockServer.url("/").toString().replaceAll("/$", "");
// Вызываем наш метод, передав ему полученный адрес
// Метод выполнит запрос к нашей имитации реального сервера
var title = App.getTitle(url);
assertThat(title).isEqualTo("Example title");
}
}
Содержимое фейковой страницы. Файл index.html
<html lang='en'>
<head>
<title>Example title</title>
</head>
<body>
<div>
<h1>Test page</h1>
</div>
</body>
</html>
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу