Spring-使用 Unroll 时启动和 Spock 失败

Spring-Boot and Spock fail when using Unroll

我正在使用 Spring-Boot 设置一个演示项目。对于实体持久性,我正在使用 Spring 基于接口生成的存储库实现:

@Repository
public interface MovieRepository extends JpaRepository<Movie, Long> {

    List<Movie> findByNameContaining(String name);
    List<Movie> findByRelease(LocalDate release);
    List<Movie> findByReleaseBetween(LocalDate start, LocalDate end);
    List<Movie> findByNameContainingAndRelease(String name, LocalDate release);
}

为了测试这一点,我将 Spock 与 Groovy 一起使用,效果非常好:

@RunWith(SpringRunner.class)
@ContextConfiguration
@SpringBootTest
class MovieRepositoryTest extends Specification {

    @Autowired
    MovieRepository movieRepository

    @Test
    def findByNameContaining_shouldFindCorrectMovies() {
        given:
        movieRepository = this.movieRepository

        when:
        def result = movieRepository.findByNameContaining("Iron Man")

        then:
        result.size() == 3
    }
}

但是当我尝试混合 Spock 的 @Unroll 时,一切都崩溃了:

@Test
@Unroll
def findByNameContaining_shouldFindCorrectMovies() {
    given:
    movieRepository = this.movieRepository

    when:
    def result = movieRepository.findByNameContaining(query)

    then:
    result.size() == expected

    where:
    query       ||  expected
    "Iron Man"  ||  3
    "Hulk"      ||  1
    "Thor"      ||  3
    "Avengers"  ||  3
    "Thanos"    ||  0
    ""          ||  20
}

结果:

[INFO] Running com.spring.boot.demo.repositories.MovieRepositoryTest
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.003 s <<< FAILURE! - in com.spring.boot.demo.repositories.MovieRepositoryTest
[ERROR] initializationError(com.spring.boot.demo.repositories.MovieRepositoryTest)  Time elapsed: 0.003 s  <<< ERROR!
java.lang.Exception: Method $spock_feature_0_0 should have no parameters

我不知道是什么原因造成的。 欢迎任何帮助。 谢谢

编辑 1: 嗯,这很有趣。我试过以下方法: * 移除@Test -> java.lang.Exception: 没有可运行的方法 * 删除@RunWith 和@ContextConfiguration -> Unroll 有效,但未注入/连线 movieRepository:java.lang.NullPointerException:无法在空对象

上调用方法 findByNameContaining()

摆弄不同的注释并没有产生一个工作场景。有猜想吗?

是的,我知道了:

RunWith 是罪魁祸首。在我的 Edit1 中,我注意到删除 @Test 的不同之处。这让我想到我可能混淆了 JUnit 测试和 Spock 测试。此外, No runnable methods 让我开始思考。并且省略 @RunWith 因为它在其他 Spock & Spring 示例中几乎不存在似乎是个好主意。将 Spring 个 bean 与 @ContextConfiguration 连接起来非常好 ;-)。显然,@SpringBootTest 不会这样做?