我正在使用Spring-Boot建立一个演示项目。对于实体持久性,我使用基于接口的Spring生成的Repository实现:
df.A=df.A.str.rstrip('*').fillna(df.A)
要对此进行测试,我将Spock与Groovy结合使用,可以实现以下奇迹:
@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的@Unroll,一切都会崩溃:
@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
}
}
结果:
@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
}
我不知道可能是什么原因引起的。 欢迎任何帮助。 谢谢
编辑1: 好吧,这很有趣。我尝试了以下方法: *删除@Test-> java.lang.Exception:没有可运行的方法 *删除@RunWith和@ContextConfiguration->展开有效,但是movieRepository没有注入/连接:java.lang.NullPointerException:无法在空对象上调用方法findByNameContaining()
尽管使用了不同的注释并没有导致可行的方案。有任何猜测吗?
答案 0 :(得分:0)
是的,我知道了
RunWith
是罪魁祸首。在Edit1中,我注意到删除@Test
的区别。那让我想到我可能会将JUnit测试与Spock测试混淆了。另外,No runnable methods
让我开始思考。并且省去@RunWith
,因为在其他Spock&Spring示例中几乎不存在@ContextConfiguration
似乎是个好主意。将Spring bean与@SpringBootTest
连接起来非常好;-)。显然,+---------+---------+--------+------------+
| item_id | user_id | amount | time |
+---------+---------+--------+------------+
| 3 | 2 | 500 | 1540152972 |
| 3 | 4 | 500 | 1540151466 |
+---------+---------+--------+------------+
不这样做吗?