Ваша ошибка возникла не потому, что вы, кстати, использовали неправильную версию Spock. Вы можете использовать модуль spock-junit4
, если хотите запустить старый JUnit 4 API. Я только что попробовал, метод работает в Spock 1 и все еще в Spock 2, хотя вам, возможно, следует перейти на что-то, что не полагается на более старый API и уровень совместимости.
Ваше сообщение об ошибке просто вызвано тот факт, что вы скопировали и вставили код из другого ответа, не исправляя его. Парень там написал MySuperSpock.Class
, что вызывает ошибку, потому что if должно быть MySuperSpock.class
с строчными буквами «C» или под Groovy просто MySuperSpock
, потому что .class
здесь необязательный.
Сообщение об ошибке даже доказывает, что у вас был JUnit 4 на пути к классам и все было найдено, иначе код, импортирующий классы API JUnit 4, не скомпилировался бы вообще. И сообщение об ошибке также объясняет, что не так, и предлагает решение:
Exception in thread "main" groovy.lang.MissingPropertyException: No such property: Class for class: de.scrum_master.testing.MyTest
Possible solutions: class
Видите? Класс MyTest
не имеет свойства с именем Class
. И одно из возможных решений (в данном случае даже правильное) - использовать .class
. Это дает вам подсказку. Кстати, синтаксис MyTest.Class
выглядит как ссылка на внутренний класс или, возможно, ссылка на свойство компилятора (для меня тоже).
Обновление: Я только что присмотрелся и заметил, что решение из другого вопроса, который вы сказали, работает для Spock 1.3, на самом деле компилируется и запускается, но бегун JUnit Core делает на самом деле не запускать тесты. Я пробовал с тестами, которые что-то печатают. Кроме того, результат сообщает, что все тесты не пройдены.
Для простых случаев вы можете использовать EmbeddedSpecRunner
Спока, который используется внутри для тестирования самого Спока. В Spock 1.x должно быть достаточно иметь JUnit 4 на пути к тестовым классам, в Spock 2, который основан на платформе JUnit 5, вам также необходимо добавить эти зависимости, потому что встроенный runner использует их:
<properties>
<version.junit>5.6.2</version.junit>
<version.junit-platform>1.6.2</version.junit-platform>
<version.groovy>3.0.4</version.groovy>
<version.spock>2.0-M3-groovy-3.0</version.spock>
</properties>
<!-- JUnit 5 Jupiter platform launcher for Spock EmbeddedSpecRunner -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${version.junit-platform}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-testkit</artifactId>
<version>${version.junit-platform}</version>
<scope>test</scope>
</dependency>
Затем вы можете запустить такой тест:
def spockRunner = new EmbeddedSpecRunner()
def spockResult = spockRunner.runClass(MyTest)
println "Tests run: " + spockResult.runCount
println "Tests ignored: " + spockResult.ignoreCount
println "Tests failed: " + spockResult.failureCount
Кстати, методы получения *Count
устарели в Spock 2, но они все еще работают. Вы можете легко заменить их на более новые, я просто хотел опубликовать код, который работает без изменений в обеих версиях Spock 1.x и 2.x.
Обновление 2: Если вы хотите запустить один и тот же тест, например, 10x одновременно, каждый в своем потоке, в Groovy простой способ сделать это:
(1..10).collect { Thread.start { new EmbeddedSpecRunner().runClass(MyTest) } }*.join()
Или, может быть, немного легче читать с несколькими разрывами строки:
(1..10)
.collect {
Thread.start { new EmbeddedSpecRunner().runClass(MyTest) }
}
*.join()
Я предполагаю, что вы знакомы с collect
(аналогично map
для Java потоков) и оператор звездочка-точка *.
(вызов метода для каждого элемента в итерируемом объекте).