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()
ただし、さまざまな注釈をいじっても、機能するシナリオにはなりませんでした。推測はありますか?