2011-07-21 35 views
6

Là người mới bắt đầu trong Phát triển thử nghiệm tôi chỉ gặp phải một vấn đề. Lớp học thử nghiệm của tôi bắt đầu như sau:Thử nghiệm JUnit độc lập với Springs @Autowired

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
@DirtiesContext 
@ContextConfiguration(locations = {"/web-test.xml"}) 
public class XXTest { 

    @Autowired 
    XX xx; 

    @Autowired 
    HibernateTemplate template; 

    @Test 
    public void testSetGetXXValue() throws Exception { 
    final Map<String, YY> profilMap = new HashMap<String, YY>(2); 
    profilMap.put("1", new YY()); 
    profilMap.put("2", new YY()); 

    simpleCockpit.setValues(profilMap); 

    assertEquals(profilMap, simpleCockpit.getValues()); 
    } 

Như bạn thấy, phương pháp thử nghiệm đầu tiên thay đổi lớp học tự động XX. Điều đó ảnh hưởng đến tất cả các phương pháp thử nghiệm sau đây, dựa trên XX có các giá trị tự động.

Làm cách nào tôi có thể thử nghiệm getter và setter từ XX VÀ đảm bảo XX có giá trị tự động cho phần còn lại của các phương pháp thử nghiệm?

Suy nghĩ:

  • Thiết lập lại các giá trị đúng ở phần cuối của phương pháp thử nghiệm. Xấu vì nếu getter/setter không hoạt động, điều này cũng sẽ không hoạt động.
  • Đặt phương pháp thử nghiệm đầu tiên vào cuối lớp kiểm tra. Xấu vì điều đó làm cho các bài kiểm tra phụ thuộc vào thứ tự thực thi của chúng.
  • Không kiểm tra bộ thu thập/setter của XX. Xấu vì getter/setter phải được kiểm tra như mọi phương thức.

Cảm ơn câu trả lời của bạn! I `m khá chắc chắn này có một giải pháp dễ dàng ... :)

EDIT: Về câu hỏi liệu kiểm tra đơn vị getters/setters hay không, tôi quyết định làm như vậy chủ yếu là vì những lý do statet tại http://www.sundog.net/sunblog/posts/should-we-test-getters-and-setters/.

Trả lời

7

Nếu bạn sửa đổi một bean được quản lý vào mùa xuân, thì bạn có thể sử dụng chú thích @DirtiesContext. Chú thích này có thể được đặt vào các lớp kiểm tra cũng như trên các phương pháp thử nghiệm!

Từ @DirtiesContext Java Đốc:

thử nghiệm chú thích mà chỉ ra rằng các {@link org.springframework.context.ApplicationContext ApplicationContext} liên kết với một thử nghiệm là bẩn và cần được đóng lại:

  • sau khi thử nghiệm hiện tại, khi được khai báo ở cấp phương thức
  • sau mỗi phương pháp thử nghiệm trong c lớp thử nghiệm urrent, khi khai báo tại lớp mức với chế độ lớp thiết lập để {@link ClassMode # AFTER_EACH_TEST_METHOD AFTER_EACH_TEST_METHOD}
  • sau khi lớp học thử nghiệm hiện tại, khi tuyên bố ở cấp lớp với chế độ lớp thiết lập để {ClassMode @link #AFTER_CLASS AFTER_CLASS}

Và ngay cả trong phát triển test Driven (để hiểu biết của tôi): viết bài kiểm tra explicite chỉ dành cho những thứ mà có độ phức tạp tối thiểu. Vì vậy, tôi không bao giờ viết các bài kiểm tra explicite cho getter và setter. Tôi thường có một kiểm tra kiểm tra một số chức năng, và khi chức năng này cần getter và setter vì vậy tôi viết getter và setter (tại thời điểm này) và chúng hoạt động sẽ được kiểm tra bởi chức năng tôi bắt đầu với ngầm định.


Đặc biệt trong trường hợp của bạn: tại sao bạn sử dụng Spring Bean, tại sao không sử dụng các đối tượng "bình thường" được tạo với new. Tôi sử dụng các lớp "bình thường" miễn là nó hữu ích cho các bài kiểm tra, chủ yếu cho các bài kiểm tra đơn giản. Tôi cũng sử dụng Spring Beans để thử nghiệm "lớn hơn".

+0

@DirtiesTiếp theo chính xác là những gì tôi đang tìm kiếm. Cảm ơn. Tôi muốn autowire đậu này bởi vì nó là một DAO cung cấp dữ liệu thử nghiệm từ một cơ sở dữ liệu. – Steven

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