【问题标题】:groovy spock test unable to find java class in same packagegroovy spock 测试无法在同一个包中找到 java 类
【发布时间】:2018-06-21 12:29:44
【问题描述】:

我对 spock 测试很陌生,我遇到了一个我无法弄清楚的毛茸茸的问题。我不确定我做错了什么

我有一个简单的 java 类

./src/main/java/com/twg/sample/model/PrimeNumberCalculator.java

package com.twg.sample.model;

import org.springframework.stereotype.Service;
import java.util.stream.IntStream;

@Service
public class PrimeNumberCalculator {

    public int[] getPrimeNumbers(int end) {
        return IntStream.rangeClosed(1, end)
            .filter(number -> !IntStream.rangeClosed(2, number / 2).anyMatch(i -> number % i == 0))
            .toArray();
    }
}

我有一个简单的 groovy spock 测试 ./src/test/groovy/com/twg/sample/model/PrimeNumberCalculatorSpec.groovy

package com.twg.sample.model

import spock.lang.Specification


class PrimeNumberCalculatorSpec extends Specification{

    def "test prime numbers"(){
        given:
        def primeCal = new PrimeNumberCalculator()

        expect:
        [1, 2, 3, 5, 7] == primeCal.getPrimeNumbers(9)
    }

}

我正在使用 intelliJ,在我将 src/test/groovy 文件夹作为源测试根目录后,测试运行良好。但是当我这样做时

mvn 全新安装 测试失败

[ERROR] Failed to execute goal org.codehaus.gmavenplus:gmavenplus-plugin:1.5:testCompile (default) on project prime-number-calculator: Error occurred while calling a method on a Groovy class from classpath.: InvocationTargetException: startup failed:
[ERROR] C:\development\prime_number_calculator\src\test\groovy\com\twg\sample\model\PrimeNumberCalculatorSpec.groovy: 10: unable to resolve class PrimeNumberCalculator
[ERROR]  @ line 10, column 24.
[ERROR]            def primeCal = new PrimeNumberCalculator()

为什么 groovy 测试找不到同一个包中的 java 类? 我的 groovy 插件是

        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <useFile>false</useFile>
                <includes>
                    <include>**/*Spec.groovy</include>
                </includes>
            </configuration>
        </plugin>

【问题讨论】:

    标签: java maven groovy spock


    【解决方案1】:

    问题是一个非常奇怪的 Surefire 怪癖。

    不起作用

    <include>**/*Spec.groovy</include>
    

    这些中的任何一个都有效:

    <include>**/*Spec.java</include>
    <include>**/*Spec.class</include>
    <include>**/*Spec.*</include>
    

    有趣,嗯(尤其是第一个变体)?我还没有检查是否有开放的 Surefire 票。您可能想创建一个并在此处发表评论。

    替代解决方案:我总是将我的 Spock 测试命名为以*Test(Surefire)或*IT(故障安全)结尾。这样我就不需要任何包含,它可以在包含混合 Java 和 Groovy 测试的项目中工作。

    【讨论】:

    • 但它确实运行了测试。只是它无法在同一个包中找到java类
    • 不,它不运行测试,甚至无法编译它(目标 testCompile 失败)。请出示您的完整 POM 或在 GitHub 上分享 MCVE,以便我重现错误。
    • 顺便说一句,我很久以前就停止使用 GMaven Plus,因为我总是遇到与 IDE 相关的问题。我使用来自 Maven 的 Groovy Eclipse,并且还配置了我的 IDE 以使用它,因此 IDE 和 Maven 使用相同的编译器。
    • 一开始我也在使用 GroovyEclipse,但是两年后我已经切换到 GMaven Plus 并且我在使用它的最新版本时没有遇到任何问题,我正在使用它10 多个项目。 YMMV,但如果您使用的是 IDEA,我会说我们是 GMaven。我还建议您遵循使用 *Test/*IT 作为结尾作为替代解决方案的安全/故障安全约定。
    • 我确实使用过 IDEA,但也使用过 Eclipse。不过,这些问题主要发生在一个复杂的 IDEA 项目中,而且对于我当时正在执教的整个团队而言。这些问题反复出现,但难以重现,并且在本地更改、功能分支切换或类似情况后重新编译项目时发生。当我们切换到 Groovy Eclipse 时,它​​们就消失了。也许新的 GMaven Plus 版本比 1.5 年前的版本更好,或者 IntelliJ IDEA 在这部分同时进行了重构。我不再能够访问我以前的客户的代码库,我无法测试。但无论如何,这只是一个小插曲。 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多