2014-06-23 21 views
7

Tôi mới làm quen với khung công tác Spring. Tôi cần phải viết bài kiểm tra đơn vị cho kho lưu trữ JPA. Tôi đang thử phương thức kho đơn giản saveAndFlush(). Nhưng không có gì lưu trong kho của tôi. Đây là mã nguồn của tôi:Đơn vị mùa xuân kiểm tra kho lưu trữ JPA

TestContext.class

@Configuration 
@PropertySource("classpath:log4j.properties") 
public class TestContext { 

    @Bean 
    public RoleService roleService() { 
     return Mockito.mock(RoleService.class); 
    } 

    @Bean 
    public RightService RightService() { 
     return Mockito.mock(RightService.class); 
    } 

    @Bean 
    public RoleRepository RoleRepository() { 
     return Mockito.mock(RoleRepository.class); 
    } 
} 

RoleServiceTest.class

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {TestContext.class}) 
@WebAppConfiguration 
public class RoleServiceTest { 

    @Autowired 
    private RoleRepository roleRepository; 

    @Test 
    public void TestServices() throws Exception { 
     RoleDetails first = new RoleDetails(); 
     first.setId("1"); 
     first.setDescription("First Description"); 
     first.setName("First"); 
     roleRepository.saveAndFlush(new RoleEntity(first)); 
     roleRepository.save(new RoleEntity(first)); 
     List<RoleEntity> roles = new ArrayList<RoleEntity>(); 
     roles = roleRepository.findAll(); 
     System.out.println(roles); 
     assertEquals(1, roles.size()); 
    } 
} 

Và lỗi:

java.lang.AssertionError: expected:<1> but was:<0> 

Tôi gần như chắc chắn có vấn đề xảy ra vì testContext.Class. Tôi đã sử dụng lớp này để kiểm tra bộ điều khiển của tôi và nó hoạt động tốt, nhưng bây giờ tôi cần phải kiểm tra cơ sở dữ liệu của tôi và tôi không biết làm thế nào để sửa đổi contextConfiguration. Tôi hy vọng ai đó sẽ giúp tôi. Cảm ơn trước!

Trả lời

7

Vấn đề là từ TestContext thực sự. Bạn cố gắng lưu đối tượng của bạn bằng cách sử dụng một đối tượng giả, đó là không chính xác.

Giải pháp là sử dụng kho lưu trữ thực. Đối với điều này, bạn cần phải làm theo các bước sau:

  1. Chú thích RoleRepository của bạn với @Repository chú thích và mở rộng các lớp với JpaRepository (RoleEntity, ID) (nơi ID là loại bạn tuyên bố id của RoleEntity).
  2. Thêm RoleRepository vào lớp Cấu hình ngữ cảnh của bạn (thực tế, không phải là bài kiểm tra). Bạn có thể thực hiện việc này bằng cách thêm @EnableJpaRepositories (value = "your.repository.package").
  3. Thay thế TestContext.class từ @ContextConfiguration chú thích trên lớp RoleServiceTest của bạn với lớp Cấu hình ngữ cảnh thực mà bạn đã sử dụng để định cấu hình dự án dựa trên Spring của mình.

Tôi hy vọng câu trả lời của tôi sẽ hữu ích, nếu bạn vẫn cần được trợ giúp, hãy hỏi lại!

5

Kho lưu trữ của bạn là đối tượng giả. Một đối tượng giả, theo định nghĩa, là một đối tượng không làm những gì nó thường làm, nhưng làm những gì bạn yêu cầu nó làm trong bài kiểm tra.

Để kiểm tra kho lưu trữ, kho lưu trữ phải là một kho lưu trữ thực. Do đó, lớp ngữ cảnh của bạn nên có

@Bean 
public RoleRepository RoleRepository() { 
    return new RoleRepositoryImpl(); // or whatever the class implementing the repository is 
} 
+1

này là chính xác về mặt kỹ thuật, nhưng rất nhiều mùa xuân kho dữ liệu sử dụng logic tự động triển khai cho các hoạt động CRUD cơ bản. Cố gắng để khởi tạo chúng trực tiếp sẽ không hoạt động; bạn nên hiển thị cách thay thế chúng bằng '@ Autowired' hoặc' @ Resource'. –

0

Nếu sử dụng Spring Boot, tạo ra một ứng dụng web và bạn đang chạy tắt của phương thức main() trong vòng một Application.class bạn có thể sử dụng:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 
public class MyUnitTest { 

    Some someInstance = new Some(); 

    @Autowired 
    private SomeRepository someRepository; 
} 

@Test 
public void testSomeClass() throws Exception { 
    Some savedSome = someRepository.save(someInstance); 
    assertEquals(1, someRepository.count()); 
} 
+1

Điều này sau đó về cơ bản sẽ là một thử nghiệm tích hợp thay vì đơn vị mặc dù phải không? Á hậu mockito cho các bài kiểm tra đơn vị, Á hậu springjunit để tích hợp – wired00

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