Làm thế nào để kiểm tra kho dữ liệu mùa xuân?


136

Tôi muốn một kho lưu trữ (giả sử UserRepository) được tạo ra với sự trợ giúp của Spring Data. Tôi chưa quen với dữ liệu mùa xuân (nhưng không phải là mùa xuân) và tôi sử dụng hướng dẫn này . Sự lựa chọn công nghệ của tôi để xử lý cơ sở dữ liệu là JPA 2.1 và Hibernate. Vấn đề là tôi không biết cách viết bài kiểm tra đơn vị cho một kho lưu trữ như vậy.

Hãy lấy create()phương pháp làm ví dụ. Khi tôi đang làm việc thử nghiệm trước tiên, tôi phải viết một bài kiểm tra đơn vị cho nó - và đó là nơi tôi gặp phải ba vấn đề:

  • Đầu tiên, làm thế nào để tôi đưa một mock of an EntityManagervào việc triển khai UserRepositorygiao diện không tồn tại ? Spring Data sẽ tạo ra một triển khai dựa trên giao diện này:

    public interface UserRepository extends CrudRepository<User, Long> {}

    Tuy nhiên, tôi không biết làm thế nào để buộc nó sử dụng một bản EntityManagergiả và các bản giả khác - nếu tôi đã tự viết bản thực hiện, tôi có thể có một phương thức setter cho EntityManagerphép tôi sử dụng bản giả cho bài kiểm tra đơn vị. (Đối với khả năng kết nối cơ sở dữ liệu thực tế, tôi có một JpaConfigurationlớp, chú thích với @Configuration@EnableJpaRepositories, mà lập trình định nghĩa đậu cho DataSource, EntityManagerFactory, EntityManagervv - nhưng kho nên kiểm tra thân thiện và cho phép trọng những điều này).

  • Thứ hai, tôi có nên kiểm tra các tương tác không? Thật khó cho tôi để tìm ra phương pháp nào EntityManagerQueryđược gọi là (gần giống với phương pháp đó verify(entityManager).createNamedQuery(anyString()).getResultList();), vì đó không phải là tôi, người đang viết bài thực hiện.

  • Thứ ba, tôi có nên kiểm tra đơn vị các phương thức tạo dữ liệu mùa xuân ở vị trí đầu tiên không? Như tôi biết, mã thư viện của bên thứ ba không được coi là đã được kiểm tra đơn vị - chỉ có mã mà các nhà phát triển tự viết được cho là được kiểm tra đơn vị. Nhưng nếu đó là sự thật, nó vẫn đưa câu hỏi đầu tiên trở lại hiện trường: giả sử, tôi có một vài phương thức tùy chỉnh cho kho lưu trữ của mình, mà tôi sẽ viết bằng cách thực hiện, làm thế nào để tôi đưa bản giả của mình vào EntityManagerQuerycuối cùng, được tạo ra kho?

Lưu ý: Tôi sẽ lái thử các kho lưu trữ của mình bằng cả tích hợp và kiểm tra đơn vị. Đối với các bài kiểm tra tích hợp của tôi, tôi đang sử dụng cơ sở dữ liệu trong bộ nhớ HSQL và rõ ràng tôi không sử dụng cơ sở dữ liệu cho các bài kiểm tra đơn vị.

Và có lẽ là câu hỏi thứ tư, có đúng không khi kiểm tra việc tạo biểu đồ đối tượng chính xác và truy xuất biểu đồ đối tượng trong các thử nghiệm tích hợp (giả sử, tôi có một biểu đồ đối tượng phức tạp được xác định bằng Hibernate)?

Cập nhật: hôm nay tôi đã tiếp tục thử nghiệm tiêm giả - Tôi đã tạo một lớp bên trong tĩnh để cho phép tiêm giả.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class UserRepositoryTest {

@Configuration
@EnableJpaRepositories(basePackages = "com.anything.repository")
static class TestConfiguration {

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        return mock(EntityManagerFactory.class);
    }

    @Bean
    public EntityManager entityManager() {
        EntityManager entityManagerMock = mock(EntityManager.class);
        //when(entityManagerMock.getMetamodel()).thenReturn(mock(Metamodel.class));
        when(entityManagerMock.getMetamodel()).thenReturn(mock(MetamodelImpl.class));
        return entityManagerMock;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return mock(JpaTransactionManager.class);
    }

}

@Autowired
private UserRepository userRepository;

@Autowired
private EntityManager entityManager;

@Test
public void shouldSaveUser() {
    User user = new UserBuilder().build();
    userRepository.save(user);
    verify(entityManager.createNamedQuery(anyString()).executeUpdate());
}

}

Tuy nhiên, việc chạy thử nghiệm này mang lại cho tôi stacktrace sau:

java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'entityManager' threw exception; nested exception is java.lang.IllegalArgumentException: JPA Metamodel must not be null!
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1493)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:121)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250)
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
    ... 28 more
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'entityManager' threw exception; nested exception is java.lang.IllegalArgumentException: JPA Metamodel must not be null!
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:108)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:62)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1489)
    ... 44 more

Câu trả lời:


118

tl; dr

Nói ngắn gọn - không có cách nào để kiểm tra các kho lưu trữ JPA dữ liệu mùa xuân một cách hợp lý vì một lý do đơn giản: đó là cách cồng kềnh để chế nhạo tất cả các phần của API JPA, chúng tôi gọi để khởi động lại các kho lưu trữ. Dù sao, các bài kiểm tra đơn vị không có ý nghĩa quá nhiều vì bạn thường không tự viết bất kỳ mã triển khai nào (xem đoạn dưới đây về triển khai tùy chỉnh) để kiểm thử tích hợp là cách tiếp cận hợp lý nhất.

Chi tiết

Chúng tôi thực hiện khá nhiều xác thực và thiết lập trả trước để đảm bảo bạn chỉ có thể khởi động một ứng dụng không có truy vấn dẫn xuất không hợp lệ, v.v.

  • Chúng tôi tạo và lưu trữ bộ đệm CriteriaQuerycho các truy vấn dẫn xuất để đảm bảo các phương thức truy vấn không chứa bất kỳ lỗi chính tả nào. Điều này đòi hỏi phải làm việc với API Tiêu chí cũng như meta.model.
  • Chúng tôi xác minh các truy vấn được xác định thủ công bằng cách yêu cầu EntityManagertạo một Queryphiên bản cho những truy vấn đó (điều này kích hoạt hiệu quả xác thực cú pháp truy vấn).
  • Chúng tôi kiểm tra Metamodeldữ liệu meta về các loại miền được xử lý để chuẩn bị kiểm tra mới, v.v.

Tất cả nội dung mà bạn có thể trì hoãn trong kho lưu trữ viết tay có thể khiến ứng dụng bị hỏng khi chạy (do truy vấn không hợp lệ, v.v.).

Nếu bạn nghĩ về nó, không có mã bạn viết cho kho lưu trữ của bạn, vì vậy không cần phải viết bất kỳ bài kiểm tra đơn vị nào . Đơn giản là không cần thiết vì bạn có thể dựa vào cơ sở thử nghiệm của chúng tôi để bắt các lỗi cơ bản (nếu bạn vẫn gặp phải một lỗi, hãy thoải mái nâng cao ). Tuy nhiên, chắc chắn cần có các thử nghiệm tích hợp để kiểm tra hai khía cạnh của lớp kiên trì của bạn vì chúng là các khía cạnh liên quan đến miền của bạn:

  • ánh xạ thực thể
  • ngữ nghĩa truy vấn (cú pháp được xác minh trên mỗi lần thử bootstrap nào).

Kiểm tra tích hợp

Điều này thường được thực hiện bằng cách sử dụng cơ sở dữ liệu trong bộ nhớ và các trường hợp thử nghiệm khởi động Spring ApplicationContextthường thông qua khung ngữ cảnh kiểm tra (như bạn đã làm), điền trước cơ sở dữ liệu (bằng cách chèn các thể hiện đối tượng thông quaEntityManager hoặc repo hoặc thông qua đơn giản Tệp SQL) và sau đó thực hiện các phương thức truy vấn để xác minh kết quả của chúng.

Thử nghiệm triển khai tùy chỉnh

Các phần triển khai tùy chỉnh của kho lưu trữ được viết theo cách mà họ không phải biết về Spring Data JPA. Chúng là những hạt đậu mùa xuân được EntityManagertiêm. Tất nhiên bạn có thể muốn thử chế giễu các tương tác với nó nhưng thành thật mà nói, việc kiểm tra đơn vị JPA không phải là một trải nghiệm quá dễ chịu đối với chúng tôi cũng như nó hoạt động với khá nhiều chỉ dẫn ( EntityManager-> CriteriaBuilder, CriteriaQueryv.v.) rằng bạn kết thúc với giả lập trở lại giả và như vậy.


5
Bạn có liên kết đến một ví dụ nhỏ về kiểm tra tích hợp với cơ sở dữ liệu trong bộ nhớ (ví dụ: h2) không?
Wim Deblauwe

7
Các ví dụ ở đây sử dụng HSQLDB. Chuyển sang H2 về cơ bản là một vấn đề trao đổi sự phụ thuộc trong pom.xml.
Oliver Drotbohm

3
Cảm ơn nhưng tôi đã hy vọng nhìn thấy một ví dụ điền trước cơ sở dữ liệu và / hoặc thực sự kiểm tra cơ sở dữ liệu.
Wim Deblauwe

1
Liên kết đằng sau "được viết theo cách" không hoạt động nữa. Có lẽ bạn có thể cập nhật nó?
Wim Deblauwe

1
Vì vậy, bạn đề xuất sử dụng kiểm tra tích hợp thay vì kiểm tra đơn vị cho việc triển khai tùy chỉnh quá? Và không viết bài kiểm tra đơn vị cho họ ở tất cả? Chỉ cần làm rõ. Không sao nếu có. Tôi hiểu lý do (quá phức tạp để chế nhạo tất cả mọi thứ). Tôi mới tham gia thử nghiệm JPA nên tôi chỉ muốn tìm hiểu.
Ruslan Stelmachenko

48

Với Spring Boot + Spring Data, mọi thứ trở nên khá dễ dàng:

@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {

    @Autowired
    MyRepository subject;

    @Test
    public void myTest() throws Exception {
        subject.save(new MyEntity());
    }
}

Giải pháp của @heez mang đến bối cảnh đầy đủ, điều này chỉ đưa ra những gì cần thiết để Giao dịch JPA + hoạt động. Lưu ý rằng giải pháp ở trên sẽ đưa ra một cơ sở dữ liệu kiểm tra bộ nhớ với điều kiện có thể tìm thấy trên đường dẫn lớp.


7
Đây là một bài kiểm tra tích hợp , không phải bài kiểm tra đơn vị mà OP đã đề cập
Iwo Kucharski

16
@IwoKucharski. Bạn nói đúng về thuật ngữ. Tuy nhiên: Do Spring Data triển khai giao diện cho bạn, bạn khó có thể sử dụng Spring và tại thời điểm đó, nó trở thành một bài kiểm tra tích hợp. Nếu tôi hỏi một câu hỏi như thế này có lẽ tôi cũng đã yêu cầu kiểm tra đơn vị mà không nghĩ về thuật ngữ. Vì vậy, tôi không thấy đó là điểm chính, hay thậm chí là trung tâm của câu hỏi.
Markus T

@RunWith(SpringRuner.class)bây giờ đã được bao gồm trong @DataJpaTest.
Maroun

@IwoKucharski, tại sao đây là kiểm tra tích hợp, không phải kiểm tra đơn vị?
dùng1182625

@ user1182625 @RunWith(SpringRunner.classbắt đầu bối cảnh mùa xuân, có nghĩa là nó đang kiểm tra sự tích hợp giữa một số đơn vị. Kiểm thử đơn vị đang kiểm tra một đơn vị -> lớp đơn. Sau đó, bạn viết MyClass sut = new MyClass();và kiểm tra đối tượng sut (sut = dịch vụ đang thử)
Iwo Kucharski

21

Điều này có thể đến một chút quá muộn, nhưng tôi đã viết một cái gì đó cho mục đích này rất nhiều. Thư viện của tôi sẽ mô phỏng các phương thức lưu trữ cơ bản cho bạn cũng như diễn giải hầu hết các chức năng của các phương thức truy vấn của bạn. Bạn sẽ phải tiêm các chức năng cho các truy vấn gốc của riêng bạn, nhưng phần còn lại được thực hiện cho bạn.

Hãy xem:

https://github.com/mmnaseri/spring-data-mock

CẬP NHẬT

Điều này hiện đang ở trung tâm Maven và trong hình dạng khá tốt.


16

Nếu bạn đang sử dụng Spring Boot, bạn chỉ cần sử dụng @SpringBootTestđể tải vào ApplicationContext(đó là thứ mà stacktrace của bạn đang sủa với bạn). Điều này cho phép bạn tự động lưu trữ trong kho dữ liệu mùa xuân của bạn. Hãy chắc chắn để thêm @RunWith(SpringRunner.class)các chú thích dành riêng cho mùa xuân được chọn:

@RunWith(SpringRunner.class)
@SpringBootTest
public class OrphanManagementTest {

  @Autowired
  private UserRepository userRepository;

  @Test
  public void saveTest() {
    User user = new User("Tom");
    userRepository.save(user);
    Assert.assertNotNull(userRepository.findOne("Tom"));
  }
}

Bạn có thể đọc thêm về thử nghiệm trong khởi động mùa xuân trong tài liệu của họ .


Đây là một ví dụ khá tốt, nhưng đơn giản theo quan điểm của tôi. Có bất kỳ tình huống trong đó thử nghiệm này thậm chí có thể thất bại ??
HopeKing

Không phải cái này mỗi lần, nhưng giả sử bạn muốn kiểm tra Predicates (đó là trường hợp sử dụng của tôi) thì nó hoạt động khá tốt.
híp

1
Đối với tôi kho lưu trữ luôn là null. Có ai giúp đỡ không?
Atul Chaudhary

Đây là câu trả lời tốt nhất. Bằng cách này, bạn kiểm tra các tập lệnh CrudRepo, Thực thể và DDL tạo (các) bảng của Thực thể.
MirandaVeracruzDeLaHoyaCardina

Tôi đã viết một bài kiểm tra chính xác như thế này. Nó hoạt động hoàn hảo khi việc triển khai Kho lưu trữ sử dụng jdbcTemplate. Tuy nhiên, khi tôi thay đổi triển khai cho dữ liệu mùa xuân (bằng cách mở rộng giao diện từ Kho lưu trữ), thử nghiệm thất bại và userRep repository.findOne trả về null. Bất kỳ ý tưởng làm thế nào để giải quyết điều này?
Rega

8

Trong phiên bản cuối cùng của spring boot 2.1.1.RELEASE , nó đơn giản như:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SampleApplication.class)
public class CustomerRepositoryIntegrationTest {

    @Autowired
    CustomerRepository repository;

    @Test
    public void myTest() throws Exception {

        Customer customer = new Customer();
        customer.setId(100l);
        customer.setFirstName("John");
        customer.setLastName("Wick");

        repository.save(customer);

        List<?> queryResult = repository.findByLastName("Wick");

        assertFalse(queryResult.isEmpty());
        assertNotNull(queryResult.get(0));
    }
}

Mã hoàn chỉnh:

https://github.com/jrichardsz/spring-boot-temsheet/blob/master/003-hql-database-with-integration-test/src/test/java/test/CustomerRepousingIntegrationTest.java


3
Điều này khá chưa hoàn chỉnh 'ví dụ': không thể được xây dựng, các thử nghiệm "tích hợp" sử dụng cùng cấu hình như mã sản xuất. I E. vô giá trị.
Martin Manya

Tôi xin lỗi. Tôi sẽ quất tôi vì lỗi này. Hãy thử một lần nữa!
JRichardsz

Điều này cũng hoạt động với 2.0.0.RELEASESpring Boot.
Nital

Bạn nên sử dụng nhúng db để kiểm tra thử nghiệm này
TuGordoBello

7

Khi bạn thực sự muốn viết một bài kiểm tra i cho kho lưu trữ dữ liệu mùa xuân, bạn có thể làm như thế này:

@RunWith(SpringRunner.class)
@DataJpaTest
@EnableJpaRepositories(basePackageClasses = WebBookingRepository.class)
@EntityScan(basePackageClasses = WebBooking.class)
public class WebBookingRepositoryIntegrationTest {

    @Autowired
    private WebBookingRepository repository;

    @Test
    public void testSaveAndFindAll() {
        WebBooking webBooking = new WebBooking();
        webBooking.setUuid("some uuid");
        webBooking.setItems(Arrays.asList(new WebBookingItem()));
        repository.save(webBooking);

        Iterable<WebBooking> findAll = repository.findAll();

        assertThat(findAll).hasSize(1);
        webBooking.setId(1L);
        assertThat(findAll).containsOnly(webBooking);
    }
}

Để làm theo ví dụ này, bạn phải sử dụng các phụ thuộc này:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

5

Tôi đã giải quyết điều này bằng cách sử dụng cách này -

    @RunWith(SpringRunner.class)
    @EnableJpaRepositories(basePackages={"com.path.repositories"})
    @EntityScan(basePackages={"com.model"})
    @TestPropertySource("classpath:application.properties")
    @ContextConfiguration(classes = {ApiTestConfig.class,SaveActionsServiceImpl.class})
    public class SaveCriticalProcedureTest {

        @Autowired
        private SaveActionsService saveActionsService;
        .......
        .......
}

4

Với JUnit5 và @DataJpaTestthử nghiệm sẽ giống như (mã kotlin):

@DataJpaTest
@ExtendWith(value = [SpringExtension::class])
class ActivityJpaTest {

    @Autowired
    lateinit var entityManager: TestEntityManager

    @Autowired
    lateinit var myEntityRepository: MyEntityRepository

    @Test
    fun shouldSaveEntity() {
        // when
        val savedEntity = myEntityRepository.save(MyEntity(1, "test")

        // then 
        Assertions.assertNotNull(entityManager.find(MyEntity::class.java, savedEntity.id))
    }
}

Bạn có thể sử dụng TestEntityManagertừ org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagergói để xác nhận trạng thái thực thể.


Mùa xuân luôn luôn tốt hơn để tạo Id cho bean thực thể.
Arundev

Đối với Java, dòng thứ hai là: @ExtendWith (value = SpringExtension. Class)
AdilOoze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.