web-dev-qa-db-ja.com

Mavenを使用したスポックの単体テストの実行

以前のプロジェクトで、Spockテストフレームワークを使用してJavaコードを単体テストしました。これは本当に生産的であることがわかったので、ビルドツールとしてMavenを使用する現在のプロジェクトにSpockテストを追加しようとしています(前のプロジェクトではGradleを使用していました)MavenでSpockテストをコンパイルできますが(groovy-Eclipse-compilerを使用)、Mavenでテストを実行できません。

2つのファイルの問題を示す簡単な例を作成しました。

  • pom.xml
  • src/test/Java/ASpec.groovy

pom.xmlの内容:

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my.group</groupId>
    <artifactId>my-artifact</artifactId>
    <version>0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
            <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.0.8</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>0.7-groovy-2.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerId>groovy-Eclipse-compiler</compilerId>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-Eclipse-compiler</artifactId>
                        <version>2.8.0-01</version>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-Eclipse-batch</artifactId>
                        <version>2.1.8-01</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

ASpec.groovyの内容:

import spock.lang.Specification

class ASpec extends Specification {

    def "Test A"(){
        // Always fail
        expect: false
    }
}

mvn clean test(またはmvn clean install)を実行すると、単一の単体テストが実行されて失敗するはずです。コンパイルされている間、Mavenはそれを実行しません。 MavenからSpockユニットテストを実行する方法を知っている人はいますか(または可能かどうか))

(サンプルをシンプルにするためにテストをパッケージに入れていません。また、src/test/Javaにgroovyコードを入れて、追加のディレクトリからソースファイルを取得するようにサンプルを構成しないようにしています。可能な限りシンプルです。)

22
Neil Stevens

Maven Surefireはテストクラスを名前で検索します。クラス名をATestに変更するか、Surefireが使用する名前パターンを再構成します。 spock-example プロジェクトのPOMは、後者の方法を示しています。

21

この回答は、@ PeterNiederwieserの回答を完全に補足するものです。その中で、Surefireが使用する名前パターンを設定できると述べています。これが私のために働いた例です:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18</version>
    <configuration>
        <includes>
            <!-- By default only files ending in 'Test' will be included, so also include support for Spock style naming convention -->
            <!-- Oddly enough for Groovy files, *Spec.groovy does not work, but *Spec.Java does -->
            <include>**/*Test.Java</include>
            <include>**/*Spec.Java</include>
        </includes>
    </configuration>
</plugin>

ソース

コメントで述べたように、理由はわかりません**/*Spec.groovyは機能しませんでしたが、ここで通常のSpockの規則を使用できることを嬉しく思います。

24
mnd

Spockを既存のJava= Webアプリに追加するという同じ要件がありました。Petersを試しましたが、うまくいきませんでした。gmavenplus-pluginどういうわけか(アイデアはありません)私のguava依存関係を非常に古いgoogle libに置き換え、Springアプリケーションは存在しないメソッドについて不満を述べました。

文字通り2〜3ダースの試行を経て、ついにSpockユニットテストと統合テストを統合し、さらに重要なことに、既存のJava/Junit Spring/HibernateアプリケーションからSpock groovyクラスのコンパイルを分離することができました。

もちろん、もし私がGradleを持っていれば、問題は解決されたでしょう...しかし、これはレガシープロジェクトであるため、選択の余地はありませんでした。

以下は私が追加したプラグインです。 SpockユニットテストはSpecで終了することに注意してください。 Spock統合テストはITで終わります(ただし、おそらくSpecITでなければなりません)。 Spockテストをsrc/test/groovyの下に置きました。

         <plugins>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <!-- Without joint compilation - no dependencies between Java and Groovy (inheritance)-->
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <sources>
                        <source>
                            <directory>${project.basedir}/src/main/Java/groovy</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </source>
                    </sources>
                    <testSources>
                        <testSource>
                            <directory>${project.basedir}/src/test/groovy</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </testSource>
                    </testSources>

                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <testSourceDirectory>src/test/groovy</testSourceDirectory>
                    <testSourceDirectory>src/test/Java</testSourceDirectory>
                    <includes>
                        <include>**/*Spec.Java</include>
                        <!-- Yes, .Java extension -->
                        <include>**/*Test.Java</include>
                        <!-- Just in case having "normal" JUnit tests -->
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <useFile>false</useFile>
                    <includes>
                        <include>**/*IT.Java</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

そして、ここに私の依存関係があります:

        <!--Spock -->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>2.4.7</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>1.1-groovy-2.4</version>
        </dependency>

        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-spring</artifactId>
            <version>1.1-groovy-2.4</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.groovy.modules.http-builder</groupId>
            <artifactId>http-builder</artifactId>
            <version>0.7.1</version>
        </dependency>
        <!--Spock mocking dependencies -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>3.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.objenesis</groupId>
            <artifactId>objenesis</artifactId>
            <version>2.6</version>
        </dependency>

ただお知らせするだけですが、私の元のPOMには明示的なプラグインがまったくありませんでしたAT ALL。したがって、プロジェクトには非常に単純なPOMがありました。それで、 shouldあなたのために働く。それはJava 1.7プロジェクトです。

...そして最後に、これがゴミの投稿ではないという自信を与えるために、私は上記が機能することを確認するために複数のテストを行いました:

  1. テストなしでWARをビルドし、ローカルにデプロイしてスモークテストするだけです
    mvn clean install -DskipTests -Dmaven.test.skip = true

  2. テストコンパイルを実行し、Groovyユニットテストもコンパイルされるかどうかを確認します。
    mvn -X clean test-compile

  3. 統合テストなしでクリーンインストールを実行し(このテストで失敗したことを確認しました)、Groovyユニットテストが実行されているかどうかを確認します。
    mvn clean install -DskipITs

  4. 統合テストを実行するだけ
    mvn failsafe:integration-test

私は上記のスクリーンショットを証拠として含めたかったのですが、検閲する必要があったでしょう...それで、私がこれが機能するように精神的に取り組んでいたので、これがあなたの助けになることを心から願っています...メイブンは巨大な主題です範囲。がんばって:=)

2
Beezer