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
不会这样做?
我正在使用 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
不会这样做?