Вопрос или проблема
У меня есть структура проекта на Java с Spring, которая выглядит следующим образом:
├── src
│ ├── integrationTest
│ │ ├── java
│ │ │ ├── foo.bar.cuke.project
│ │ │ │ ├── controller
│ │ │ │ │ ├── TestControllerIT.java
│ │ │ │ ├── CucumberSpringConfiguration.java
│ │ │ │ ├── CucumberTest.java
│ │ ├── resources
│ │ │ ├── features
│ │ │ │ ├── test.feature
│ │ │ ├── junit-platform.properties
│ ├── main
│ ├── test
Вот как выглядят различные файлы:
CucumberSpringConfiguration.java
:
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
@CucumberContextConfiguration
public class CucumberSpringConfiguration {
@Autowired
protected TestRestTemplate testRestTemplate;
}
CucumberTest.java
:
@Suite
@SelectClasspathResource("src/integrationTest/resources/features")
public class CucumberTest {
}
TestControllerIT.java
:
public class TestControllerIT extends CucumberSpringConfiguration {
@Given("random given text")
public void testGiven() {
System.out.println("test");
}
}
test.feature
:
Feature: Это тестовая функциональность
Scenario: Тестовый сценарий
Given random given text
When a condition is met
Then do something
junit-platform.properties
:
cucumber.plugin=junit:target/cucumber-reports/cucumber.xml
cucumber.glue=foo.bar.cuke.project.controller
Я использую IntelliJ с плагинами cucumber и gherkin. Я не знаю точно, какой файл запускать, но когда я запускаю файл функциональности, я получаю следующую ошибку:
Suppressed: java.lang.SecurityException: информация о подписчике класса "org.bouncycastle.jcajce.provider.asymmetric.edec.KeyFactorySpi$Ed448" не соответствует информации о подписчике других классов в том же пакете
at java.base/java.lang.ClassLoader.checkCerts(ClassLoader.java:1156)
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:911)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1020)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
Когда я запускаю класс CucumberTest
, я получаю эту ошибку:
> Task :integrationTest
0 проходящих (1.9s)
> Task :integrationTest FAILED
FAILURE: Сборка завершилась с исключением.
* Что пошло не так:
Ошибка выполнения для задачи ':integrationTest'.
> Тесты не найдены для заданных включений: [foo.bar.cuke.project.CucumberTest](--tests filter)
В чем проблема с моей настройкой? Почему cucumber не может найти мой IT файл и запустить тест?
Мой технологический стек:
- Java 11
- Spring framework 5.3
- JUnit 5
- Cucumber 7.18
- Gradle 7.3
Я пробовал добавить следующее в мой build.gradle
без успеха:
testSets {
integrationTest
}
test {
systemProperty 'server.ssl.enabled', false
}
Также пробовал изменить структуру директории, чтобы контроллер IT находился в директории под названием StepDefintions
.
Ответ или решение
Ваш проект Java со Spring и Cucumber имеет определенные проблемы, которые могут вызывать трудности при запуске тестов. Перед тем как предложить решение, давайте детализируем возможные причины ошибок, которые вы наблюдали.
Возможные проблемы
-
Проблема с классами и их сигнатурой:
У вас возникла ошибкаjava.lang.SecurityException: class "org.bouncycastle.jcajce.provider.asymmetric.edec.KeyFactorySpi$Ed448"'s signer information does not match signer information of other classes in the same package
. Эта ошибка чаще всего возникает, когда несколько версий одной и той же библиотеки (в данном случае Bouncy Castle) присутствуют в класспасе. Проверьте ваши зависимости и убедитесь, что используете только одну версию библиотеки Bouncy Castle. - Не найдено тестов:
СообщениеNo tests found for given includes: [foo.bar.cuke.project.CucumberTest]
указывает на то, что JUnit не может обнаружить ваш класс тестов. Проблема может быть связана с неправильной конфигурацией вашего Gradle.
Решение
-
Обновите файл
build.gradle
:
Убедитесь, что ваш файлbuild.gradle
правильно настроен для выполнения интеграционных тестов с Cucumber. Вот пример настройки:plugins { id 'java' id 'io.cucumber' version '7.18.0' } repositories { mavenCentral() } dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-spring' testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.bouncycastle:bcprov-jdk15on:1.68' // Убедитесь, что версия уникальная } test { useJUnitPlatform() } task integrationTest(type: Test) { useJUnitPlatform() include '**/CucumberTest*' }
-
Проверьте структуру каталогов:
Убедитесь, что ваша структура каталогов соответствует стандартам Gradle. Интеграционные тесты должны находиться в каталогеsrc/integrationTest/java
, а ваши ресурсы вsrc/integrationTest/resources
. -
Запуск тестов:
Вам необходимо запустить интеграционные тесты через Gradle. Вы можете использовать команду:./gradlew integrationTest
- Обновите и проверьте зависимости:
Если вы все еще получаете ошибки, попробуйте обновить зависимости вашего проекта. Убедитесь, что у вас нет конфликтующих версий библиотек. Можно использовать команду./gradlew dependencies
для просмотра всех зависимостей и их версий.
Заключение
Следуя этим шагам, вы сможете устранить проблемы, связанные с интеграционными тестами в вашем проекте Spring с Cucumber. Обратите внимание на вывод сообщений об ошибках и проверьте зависимости, особенно версию Bouncy Castle, чтобы избежать проблем с несовместимостью. Если проблема не исчезнет, предоставьте дополнительные детали, и мы сможем рассмотреть более конкретные решения.