• Spring Boot TestEntityManager


    Spring Boot TestEntityManager 教程展示了如何使用 TestEntityManager 在 JPA 测试中。TestEntityManager 提供了 EntityManager 方法的子集 对于测试以及常见测试任务的帮助程序方法很有用 例如“保留”或“查找”。

    Spring是一个流行的 Java 应用程序框架,用于创建企业应用程序。Spring Boot 是 Spring框架的演变,有助于创建 基于Spring的独立生产级应用程序,只需最少的努力。

    测试实体管理器

    TestEntityManager允许在测试中使用。春天是一个抽象的结束; 它使开发人员免受JPA的较低级别细节的影响,并带来了许多便利 方法。但是春天允许在需要时使用 应用程序代码和测试。EntityManagerRepositoryEntityManagerEntityManager

    在我们的测试中,我们可以注入数据源、@JdbcTemplate、@EntityManager或任何 来自我们应用程序的 Spring 数据存储库。

    弹簧测试实体管理器示例

    以下应用程序用于保存一些 测试方法中的城市实体。TestEntityManager

    1. pom.xml
    2. src
    3. ├───main
    4. │ ├───java
    5. │ │ └───com
    6. │ │ └───zetcode
    7. │ │ │ Application.java
    8. │ │ │ MyRunner.java
    9. │ │ ├───model
    10. │ │ │ City.java
    11. │ │ └───repository
    12. │ │ CityRepository.java
    13. │ └───resources
    14. └───test
    15. └───java
    16. └───com
    17. └───zetcode
    18. └───repository
    19. CityRepositoryTest.java

    这是项目结构。

    绒球.xml
    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    3. http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. 4.0.0
    5. com.zetcode
    6. springboottestentitymanager
    7. 1.0-SNAPSHOT
    8. jar
    9. UTF-8
    10. 17
    11. 17
    12. org.springframework.boot
    13. spring-boot-starter-parent
    14. 2.6.7
    15. org.springframework.boot
    16. spring-boot-starter-data-jpa
    17. org.springframework.boot
    18. spring-boot-starter-test
    19. test
    20. com.h2database
    21. h2
    22. runtime
    23. org.springframework.boot
    24. spring-boot-maven-plugin
    25. 2.6.7

    该Maven POM文件包含Spring Data JPA,测试和H2数据库的依赖项。

    com/zetcode/model/City.java
    1. package com.zetcode.model;
    2. import java.util.Objects;
    3. import javax.persistence.Entity;
    4. import javax.persistence.GeneratedValue;
    5. import javax.persistence.GenerationType;
    6. import javax.persistence.Id;
    7. import javax.persistence.Table;
    8. @Entity
    9. @Table(name = "cities")
    10. public class City {
    11. @Id
    12. @GeneratedValue(strategy = GenerationType.AUTO)
    13. private Long id;
    14. private String name;
    15. private int population;
    16. public City() {
    17. }
    18. public City(String name, int population) {
    19. this.name = name;
    20. this.population = population;
    21. }
    22. public Long getId() {
    23. return id;
    24. }
    25. public void setId(Long id) {
    26. this.id = id;
    27. }
    28. public String getName() {
    29. return name;
    30. }
    31. public void setName(String name) {
    32. this.name = name;
    33. }
    34. public int getPopulation() {
    35. return population;
    36. }
    37. public void setPopulation(int population) {
    38. this.population = population;
    39. }
    40. @Override
    41. public int hashCode() {
    42. int hash = 7;
    43. hash = 79 * hash + Objects.hashCode(this.id);
    44. hash = 79 * hash + Objects.hashCode(this.name);
    45. hash = 79 * hash + this.population;
    46. return hash;
    47. }
    48. @Override
    49. public boolean equals(Object obj) {
    50. if (this == obj) {
    51. return true;
    52. }
    53. if (obj == null) {
    54. return false;
    55. }
    56. if (getClass() != obj.getClass()) {
    57. return false;
    58. }
    59. final City other = (City) obj;
    60. if (this.population != other.population) {
    61. return false;
    62. }
    63. if (!Objects.equals(this.name, other.name)) {
    64. return false;
    65. }
    66. return Objects.equals(this.id, other.id);
    67. }
    68. @Override
    69. public String toString() {
    70. var builder = new StringBuilder();
    71. builder.append("City{id=").append(id).append(", name=")
    72. .append(name).append(", population=")
    73. .append(population).append("}");
    74. return builder.toString();
    75. }
    76. }

    这是实体。City

    com/zetcode/repository/CityRepository.java
    1. package com.zetcode.repository;
    2. import com.zetcode.model.City;
    3. import org.springframework.data.repository.CrudRepository;
    4. import org.springframework.stereotype.Repository;
    5. import java.util.List;
    6. @Repository
    7. public interface CityRepository extends CrudRepository {
    8. List findByName(String name);
    9. }

    CityRepository包含自定义方法。Spring 检查方法的名称,并从其关键字派生查询。findByName()

    com/zetcode/MyRunner.java
    1. package com.zetcode;
    2. import com.zetcode.model.City;
    3. import com.zetcode.repository.CityRepository;
    4. import org.slf4j.Logger;
    5. import org.slf4j.LoggerFactory;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.boot.CommandLineRunner;
    8. import org.springframework.stereotype.Component;
    9. @Component
    10. public class MyRunner implements CommandLineRunner {
    11. private static final Logger logger = LoggerFactory.getLogger(MyRunner.class);
    12. @Autowired
    13. private CityRepository cityRepository;
    14. @Override
    15. public void run(String... args) throws Exception {
    16. logger.info("Saving cities");
    17. cityRepository.save(new City("Bratislava", 432000));
    18. cityRepository.save(new City("Budapest", 1759000));
    19. cityRepository.save(new City("Prague", 1280000));
    20. cityRepository.save(new City("Warsaw", 1748000));
    21. logger.info("Retrieving cities");
    22. var cities = cityRepository.findAll();
    23. cities.forEach(city -> logger.info("{}", city));
    24. }
    25. }

    Inwe 使用 thes 来保存和 检索实体。数据存储在内存中的 H2 数据库中。MyRunnerCityRepository

    注意:在 Java 企业应用程序中,这是一种很好的做法 以定义使用存储库的服务层。出于简单起见, 我们跳过服务层。

    com/zetcode/Application.java
    1. package com.zetcode;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class Application {
    6. public static void main(String[] args) {
    7. SpringApplication.run(Application.class, args);
    8. }
    9. }

    设置弹簧引导应用程序。 启用自动配置和 组件扫描。Application@SpringBootApplication

    com/zetcode/repository/CityRepositoryTest.java
    1. package com.zetcode.repository;
    2. import com.zetcode.model.City;
    3. import org.junit.Test;
    4. import org.junit.runner.RunWith;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    7. import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
    8. import org.springframework.test.context.junit4.SpringRunner;
    9. import static org.assertj.core.api.Assertions.assertThat;
    10. import static org.junit.Assert.assertEquals;
    11. @RunWith(SpringRunner.class)
    12. @DataJpaTest
    13. public class CityRepositoryTest {
    14. @Autowired
    15. private TestEntityManager entityManager;
    16. @Autowired
    17. private CityRepository repository;
    18. @Test
    19. public void testFindByName() {
    20. entityManager.persist(new City("Bratislava", 432000));
    21. entityManager.persist(new City("Budapest", 1759000));
    22. entityManager.persist(new City("Prague", 1280000));
    23. entityManager.persist(new City("Warsaw", 1748000));
    24. var cities = repository.findByName("Bratislava");
    25. assertEquals(1, cities.size());
    26. assertThat(cities).extracting(City::getName).containsOnly("Bratislava");
    27. }
    28. }

    在中,我们测试自定义 JPA 方法。CityRepositoryTest

    1. @Autowired
    2. private TestEntityManager entityManager;

    我们注入。TestEntityManager

    1. @RunWith(SpringRunner.class)
    2. @DataJpaTest
    3. public class CityRepositoryTest {

    @DataJpaTest用于测试 JPA 存储库。它与 @RunWith(SpringRunner.class)。注释禁用完全自动配置 并且仅应用与 JPA 测试相关的配置。默认情况下,测试 使用@DataJpaTest注释使用嵌入式内存数据库。

    1. entityManager.persist(new City("Bratislava", 432000));
    2. entityManager.persist(new City("Budapest", 1759000));
    3. entityManager.persist(new City("Prague", 1280000));
    4. entityManager.persist(new City("Warsaw", 1748000));

    我们用方法拯救了四个城市。EntityManager'spersist()

    1. var cities = repository.findByName("Bratislava");
    2. assertEquals(1, cities.size());

    我们测试该方法返回一个城市。findByName()

    assertThat(cities).extracting(City::getName).containsOnly("Bratislava");
    

    在这里,我们测试城市的名称。

    $ mvn spring-boot:test
    

    我们运行测试。

    在本教程中,我们在测试中使用了。TestEntityManager

  • 相关阅读:
    CSS基础语法
    CTF入门指南
    10月26日星期四今日早报简报微语报早读
    linux高级作业
    Kubernetes多租户策略的好处和挑战
    专利申请需要多少钱
    嵌入式Linux驱动开发---GPIO子系统和Pinctrl子系统
    UE4和C++ 开发-C++绑定widget的方式和初始化UI
    26-k8s的附加组件-图形化管理工具dashboard
    python之常用的内置模块以及正则表达式的使用
  • 原文地址:https://blog.csdn.net/allway2/article/details/128177170