【问题标题】:Spring boot - unit testing Spring Data JPA repositoriesSpring Boot - 单元测试 Spring Data JPA 存储库
【发布时间】:2019-01-23 16:40:03
【问题描述】:

我有一个在 Spring Data 的帮助下创建的存储库(比如 MovieRepository)。

public interface MovieRepository extends JpaRepository<Movie, Short> {}  

假设我想对 JpaRepository 接口 提供的方法之一进行单元测试,例如 getOne(short id),这有意义吗?因为我通常不会自己编写任何实现代码。

如果我自己编写一个带有查询的方法,例如:

@Query("SELECT m " +
            "FROM Movie m inner join  MovieGenre mg ON m.id = mg.movie.id " +
            "WHERE mg.genre.id = (SELECT mg2.genre.id FROM MovieGenre mg2 WHERE mg2.movie.id = ?1 AND mg2.movie.id <> mg.movie.id AND mg.genre.id = mg2.genre.id) " +
            "GROUP BY mg.movie.id " +
            "ORDER BY count(m) DESC")
Page<Movie> findRelatedMoviesToMovieById(@Param("id") short id, Pageable pageable);  

我应该测试这个方法吗?

【问题讨论】:

    标签: java spring-boot junit spring-data


    【解决方案1】:

    没有理由为存储库编写单元测试,因为您自己没有编写任何实现代码。如果要测试查询,最好编写集成测试。这些是通过使用内存数据库完成的,并且测试应该在 Spring 容器中运行。 Spring-Boot 对集成测试有很多支持:

    • 应该使用 @RunWith(SpringRunner.class) 运行测试,这会启动 Spring 容器;
    • @DataJpaTest - 这些应该与 SpringRunner.class 结合使用,以运行内存数据库;

    例子:

    @RunWith(SpringRunner.class)
    @DataJpaTest
    public class MovieRepositoryTests {
    
       @Autowired
       private MovieRepository myRepository;
    
       @Test
       public void findRelatedMoviesToMovieByIdTest() {
           ...
           Page<Movie> movies= myRepository.findRelatedMoviesToMovieByIdTest(1, new PageRequest(1, 10));
           ...
       }
    }
    

    【讨论】:

    • 值得一提的是,有时也建议不要使用 in-memory 数据库,而是使用真实数据库的实例(当然,出于测试目的)。我的意思是,这不是必须遵循的规则。
    猜你喜欢
    • 2018-06-26
    • 2018-08-06
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2018-03-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多