Проект содержит тесты для сравнения сгенерированного Java кода с ожидаемым. Тесты покрывают два сценария:
- Генерация без Lombok (
without-lombok) - Генерация с Lombok (
with-lombok)
-
GenerationComparisonTestBase- базовый класс для сравнения сгенерированного кода с ожидаемым- Расположен:
src/test/java/ru/yojo/codegen/generator/base/ - Предоставляет методы для генерации и сравнения файлов
- Расположен:
-
Тестовые классы для каждого контракта:
TestContractWithoutLombokTest/TestContractWithLombokTest- дляtest.yamlAsyncApiV3WithoutLombokTest/AsyncApiV3WithLombokTest- дляasync-api-official-v3.0.yamlGitterWithoutLombokTest/GitterWithLombokTest- дляgitter-streaming-async-api-v3.0.yamlSlackWithoutLombokTest/SlackWithLombokTest- дляslack-real-time-async-api-v3.0.yamlSpecFromIssueWithoutLombokTest/SpecFromIssueWithLombokTest- дляspec-from-issue.yamlOneMoreWithoutLombokTest/OneMoreWithLombokTest- дляone-more.yamlDiscriminatorWithoutLombokTest/DiscriminatorWithLombokTest- дляdiscriminator.yamlTestCreateAppWithoutLombokTest/TestCreateAppWithLombokTest- дляtest-create-app.yaml
Ожидаемые файлы расположены в:
src/test/resources/example/expected/without-lombok/- для генерации без Lomboksrc/test/resources/example/expected/with-lombok/- для генерации с Lombok
Структура внутри этих директорий соответствует package location:
test/- для контракта test.yaml (package:example.testGenerate.test)asyncapi/- для AsyncAPI v3 контрактовgitter/- для Gitter контрактовslack/- для Slack контрактовspecFromIssue/- для spec-from-issueoneMore/- для one-more.yamldiscriminator/- для discriminator.yamltestCreateApp/- для test-create-app.yaml
./gradlew test# Без Lombok
./gradlew test --tests "ru.yojo.codegen.generator.TestContractWithoutLombokTest"
# С Lombok
./gradlew test --tests "ru.yojo.codegen.generator.TestContractWithLombokTest"./gradlew test --tests "ru.yojo.codegen.generator.*WithoutLombokTest"./gradlew test --tests "ru.yojo.codegen.generator.*WithLombokTest"Если структура генерируемого кода изменилась, нужно обновить ожидаемые файлы:
-
Запустите тест
GenerateExpectedFilesTest:# Обновить файлы без Lombok ./gradlew test --tests "ru.yojo.codegen.generator.GenerateExpectedFilesTest.generateWithoutLombok" # Обновить файлы с Lombok ./gradlew test --tests "ru.yojo.codegen.generator.GenerateExpectedFilesTest.generateWithLombok"
-
Тест сгенерирует файлы в директории
src/test/resources/example/expected/
Если нужно обновить только конкретный контракт:
- Измените
packageLocationиspecNameв методеgenerateForSpec()классаGenerateExpectedFilesTest - Запустите тест
- Проверьте сгенерированные файлы
Для добавления тестов для нового контракта:
- Создайте новый YAML файл в
src/test/resources/example/contract/ - Создайте два тестовых класса (без Lombok и с Lombok):
public class NewContractWithoutLombokTest extends GenerationComparisonTestBase { @Override protected boolean useLombok() { return false; } @Override protected String getSpecName() { return "new-contract.yaml"; } @Override protected String getPackageLocation() { return "newContract"; } @Test void testNewContractWithoutLombok() throws IOException { generateAndCompare(); } }
- Сгенерируйте ожидаемые файлы с помощью
GenerateExpectedFilesTest - Запустите тесты для проверки
- Использует JUnit 5
@TempDirдля создания временной директории - Сравнивает содержимое файлов, а не только их наличие
- Нормализует содержимое (убирает лишние пробелы, приводит переносы строк к единому виду)
- Если ожидаемая директория не существует, просто проверяет, что генерация проходит успешно
- Тесты падают с подробным сообщением о различиях между ожидаемым и сгенерированным кодом
- В сообщении об ошибке выводятся как ожидаемое, так и фактическое содержимое файлов
Для контрактов, разделенных на несколько файлов (в директории contract/separated/), созданы отдельные тесты:
SeparatedCollectionTypesTestSeparatedNumericValuesTestSeparatedObjectTypesTestSeparatedStringValuesTest
Эти тесты пока только проверяют, что генерация проходит успешно, без сравнения с ожидаемым.
- Проверка сгенерированного кода: Если тест падает, посмотрите на различия в отчете:
build/reports/tests/test/index.html - Отладка: Включите подробный вывод:
./gradlew test --info - Очистка: Для очистки сгенерированных файлов:
./gradlew clean