を、答えはおそらくです:いいえ、あなたはそのシュアプラグイン機能を使用して、スポックと、特定のテストメソッドを呼び出すことはできません。その理由の下に。
import spock.lang.Specification
class HelloSpec extends Specification {
def hello = new Main();
def sayHello() {
given: "A person's name is given as a method parameter."
def greeting = hello.sayHello("Petri");
expect: "Should say hello to the person whose name is given as a method parameter"
greeting == "Hello Petri";
println "hello from HelloSpec"
}
}
そして、以下のプラグインの設定与えられた:それはmvn clean test
を実行するMavenのtest
相の一部として正常に動作
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<goals>
<goal>addTestSources</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<sources>
<fileset>
<directory>${pom.basedir}/src/test/java</directory>
<includes>
<include>**/*.groovy</include>
</includes>
</fileset>
</sources>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*Spec.java</include>
</includes>
</configuration>
</plugin>
を:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.sample.HelloSpec
hello from HelloSpec
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.314 sec - in com.sample.HelloSpec
次スポックのテストケースを考えると
mvn clean test -Dtest=HelloSpec
上記と全く同じ結果が得られ、正常に実行されます。
なぜ、私たちは1つの方法を実行できないのですか?
我々は次のような出力を得る上で、我々はHelloSpecのサンプルテストにjavap
コマンドを実行した場合:
Compiled from "HelloSpec.groovy"
public class com.sample.HelloSpec extends spock.lang.Specification implements groovy.lang.GroovyObject {
public static transient boolean __$stMC;
public com.sample.HelloSpec();
public void $spock_feature_0_0();
protected groovy.lang.MetaClass $getStaticMetaClass();
public groovy.lang.MetaClass getMetaClass();
public void setMetaClass(groovy.lang.MetaClass);
public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
public java.lang.Object getProperty(java.lang.String);
public void setProperty(java.lang.String, java.lang.Object);
public java.lang.Object getHello();
public void setHello(java.lang.Object);
}
スポックができるようにするために、メソッド名が変更されるためので、生成されたバイトコードには何のsayHello
方法は、ありませんそれらのスペース。だからあなたが書いたメソッド名は実際にはコンパイルされたクラスの一部として実際のメソッド名ではありません。
この場合、メソッド名はおそらく$spock_feature_0_0
であり、本当に親切ではありません。
これはまたthis answerと実際にスポックの著者のPeter Niederwieserのコメントで確認されていますので、信頼できるソース以上です。
あなたは次のことを実行してみてください:確かに本当のメソッド名と一致する必要があります
mvn clean test -Dtest=HelloSpec#*spock*
ていますが、しかし、エラー
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.sample.HelloSpec
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.007 sec <<< FAILURE! - in com.sample.HelloSpec
initializationError(org.junit.runner.manipulation.Filter) Time elapsed: 0.006 sec <<< ERROR!
java.lang.Exception: No tests found matching Method $spock_feature_0_0(com.sample.HelloSpec) from [email protected]
at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:35)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:275)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:149)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Results :
Tests in error:
Filter.initializationError » No tests found matching Method $spock_feature_0_...
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
になるだろうこれは、直接呼び出しに最も可能性が高いです私たちはJUnitとSpockの間の接着剤を迂回しており、そのような実行は失敗します。
素敵な証拠。ここでSpockはそれがサポートしている素敵な命名規則のために敬意を表しています。 –