1

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);
}

これをテストするために、Groovy で Spock を使用しています。

@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: Cannot invoke null オブジェクトのメソッド findByNameContaining()

ただし、さまざまな注釈をいじっても、機能するシナリオにはなりませんでした。推測はありますか?

4

1 に答える 1