2016-12-12 14 views
12

Tôi có một lớp thử nghiệmLàm thế nào để thiết lập lại giữa các xét nghiệm

@RunWith(SpringRunner.class) 
@DataJpaTest 

Tôi có hai bài kiểm tra. Trong mọi thử nghiệm, tôi thực hiện thao tác tương tự, vẫn tồn tại đối tượng. Chỉ có cuộc gọi tìm thấy khác nhau.

Nếu tôi chạy cả hai kiểm tra cùng nhau, chúng sẽ thất bại nhưng nếu tôi chạy thử nghiệm cái khác thì chúng thành công.

Không có đặt lại giữa mỗi bài kiểm tra. Làm thế nào để làm điều đó? Chỉ cuộc gọi đến kho lưu trữ là khác nhau trong mỗi bài kiểm tra.

@Test 
public void findTopByCommerceCommerceIdOrderByEntryTimeDesc() { 

    Long commerceId = 1L; 

    Commerce commerce = new Commerce(); 
    commerce.setName("test"); 
    this.entityManager.persist(commerce); 

    Member member = new Member(); 
    member.setCommerce(commerce); 
    member.setMan(true); 
    member.setName("bob binette"); 

    this.entityManager.persist(member); 

    Visit visit1 = new Visit(); 
    visit1.setCommerce(commerce); 

    visit1.setMember(member); 
    visit1.setEntryTime(LocalDateTime.of(LocalDate.now(), LocalTime.now())); 

    Visit visit2 = new Visit(); 
    visit2.setCommerce(commerce); 

    visit2.setMember(member); 
    visit2.setEntryTime(LocalDateTime.of(LocalDate.now().minusDays(2), LocalTime.now())); 

    this.entityManager.persist(visit1); 
    this.entityManager.persist(visit2); 

    Visit visit = visitRepository.findTopByCommerceCommerceIdOrderByEntryTimeDesc(commerceId); 

    assertEquals(visit.getVisitId(), Long.valueOf("1")); 

} 

Sửa

tôi đặt tất cả các mã: http://pastebin.com/M9w9hEYQ

+2

Sử dụng JUnit ['@ Before'] (http://junit.sourceforge.net/javadoc/org/junit/Before.html) và [' @ After'] (http://junit.sourceforge.net/ javadoc/org/junit/After.html)? – manish

+0

Bằng cách thực hiện các thử nghiệm của bạn '@ Transactional'. –

+1

Kiểm tra 'DataJpaTest' được giao dịch theo mặc định Martijn. Một cái gì đó khác đang xảy ra mà chúng ta không thấy: nó sẽ làm việc ra khỏi hộp. –

Trả lời

8

Trong trường hợp của bạn cho mỗi bài kiểm tra bạn kiên trì cùng một dữ liệu. Vì vậy, bạn nên duy trì dữ liệu trước khi tất cả các thử nghiệm hoặc tồn tại trước mỗi bài kiểm tra và làm sạch sau khi nó.

1. Persist trước khi tất cả các thử nghiệm

@BeforeClass 
public static void init(){ 
    //persist your data 
} 

@AfterClass 
public static void clear(){ 
    //remove your data 
} 

@Test 
public void findTopByCommerceCommerceIdOrderByEntryTimeDesc() { 
    Visit visit = visitRepository.findTopByCommerceCommerceIdOrderByEntryTimeDesc(commerceId); 

    assertEquals(visit.getVisitId(), Long.valueOf("1")); 
} 

Trong trường hợp này @AfterClass là tùy

2. Persist trước mỗi bài kiểm tra và làm sạch sau mỗi lần kiểm tra

@Before 
    public void init(){ 
     //persist your data 
    } 

    @After 
    public void clear(){ 
     //remove your data 
    } 

    @Test 
    public void findTopByCommerceCommerceIdOrderByEntryTimeDesc() { 
     Visit visit = visitRepository.findTopByCommerceCommerceIdOrderByEntryTimeDesc(commerceId); 

     assertEquals(visit.getVisitId(), Long.valueOf("1")); 
    } 

Hãy nhớ rằng các phương thức sử dụng @BeforeClass và @AfterClass phải tĩnh.

+0

Tôi sẽ đề xuất '@ Before' và' @ After'. Thực hành được khuyến nghị: http://stackoverflow.com/a/14737697/5012277 –

+0

đã cố gắng thêm this.entityManager.remove (visit1); this.entityManager.remove (visit2); sau khi khẳng định ... gặp vấn đề tương tự –

+0

Bạn có thể thêm đoạn mã hay không. – marok

4

Bạn có thể sử dụng chú thích @DirtiesContext trên lớp thử nghiệm của mình để đặt lại các thử nghiệm, ở đó bạn cũng có thể chọn thời điểm đặt lại. Mặc định là sau mỗi phương thức, nhưng bạn có thể thay đổi điều đó bằng cách chuyển các tham số khác nhau vào chú thích @DirtiesContext.

import org.springframework.test.annotation.DirtiesContext; 

@RunWith(SpringRunner.class) 
@DataJpaTest 
@DirtiesContext 
public class VisitRepositoryTest { 
+0

đã cố thêm @DirtiesContext nhưng tôi gặp vấn đề tương tự. –

2

Bạn đã cố gắng để xóa bộ nhớ cache peristence giữa mỗi bài kiểm tra, theo TestEntityManager#clear()

@After 
public void clear() { 
    this.entityManager.clear(); 
} 

Hoặc có thể cố gắng thiết lập Visitor của bạn như các lĩnh vực và loại bỏ chúng trong một sau đó, hơn tuôn những thay đổi :

Visit visit1; 

Visit visit2; 

@After 
public void clear(){ 
    if (visit1 != null) 
     this.entityManager.remove(visit1); 
    if (visit2 != null) 
     this.entityManager.remove(visit2); 
    this.entityManager.flush(); 
} 
4

Thêm chú thích @DirtiesContext, nhưng cung cấp cho nó với AFTER_EACH_TEST_METHOD classMode

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
2

Sử dụng @Sql với ExecutionPhase.AFTER_TEST_METHOD và vượt qua các kịch bản được sử dụng để làm sạch cơ sở dữ liệu

@Sql(scripts="classpath:cleanup.sql",executionPhase=Sql.ExecutionPhase.AFTER_TEST_METHOD) 
@Test 
public void whateverIsYourTestMethod() 
{ 
... 
} 

Trong trường hợp bạn đang sử dụng chú thích @Transactional, bạn có thể sử dụng:

@Sql(scripts="classpath:cleanup.sql",executionPhase=Sql.ExecutionPhase.AFTER_TEST_METHOD,config = @SqlConfig 
     (transactionMode = TransactionMode.ISOLATED, 
     transactionManager = "transactionManager", 
     dataSource= "dataSource")) 
@Test 
@Commit 
@Transactional 
public void whateverIsYourTestMethod(){...} 
0

@DirtiesContext(classMode =DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) công trình đối với tôi, nhưng nó chỉ cần thiết khi tôi chạy @DataJpaTest() với @AutoConfigureTestDatabase(replace=Replace.NONE) và hồ sơ costum cho mysql, mặc định h2 hoạt động mà không có điều này.

Các vấn đề liên quan