2012-06-13 31 views
5

Thực hành tốt nhất để kiểm tra một Dịch vụ Grails phụ thuộc vào Dịch vụ khác là gì? Các mixin mặc định TestFor tiêm một cách chính xác các dịch vụ dưới kiểm tra, cho ví dụ:Thử nghiệm tích hợp Grails với nhiều dịch vụ

@TestFor(TopService) 
class TopServiceTests { 
    @Test 
    void testMethod() { 
     service.method() 
    } 
} 

nhưng nếu ví dụ của tôi về TopService (dịch vụ) dựa trên một dịch vụ, như InnerService:

class TopService { 
    def innerService 
} 

innerService sẽ không được có sẵn, phụ thuộc tiêm dường như không điền vào biến này. Tôi nên tiến hành như thế nào?

+0

Thử mở rộng 'GroovyTestCase' trong thử nghiệm của bạn. –

Trả lời

8

Kiểm tra tích hợp không nên sử dụng chú thích @TestFor, chúng phải là extend GroovyTestCase. Các chú thích kiểm tra chỉ dành cho các bài kiểm tra đơn vị (và sẽ có hành vi xấu khi được sử dụng trong các bài kiểm tra tích hợp, đặc biệt là các chú thích @Mock). Bạn đang nhìn thấy một trong những hành vi xấu bây giờ.

Nếu bạn mở rộng GroovyTestCase bạn có thể sau đó chỉ cần có

def topService 

Ở phía trên cùng của thử nghiệm của bạn và nó sẽ được tiêm với tất cả nó phụ thuộc tiêm.

Đối với trường hợp kiểm tra đơn vị, bạn chỉ muốn thêm các trường hợp dịch vụ được liên kết mới vào dịch vụ của mình theo phương thức setUp. Giống như:

@TestFor(TopService) 
class TopServiceTests { 
    @Before public void setUp() { 
     service.otherService = new OtherService() 
    } 
    ... 
+0

Cảm ơn! Cuối cùng tôi đã hiểu nó với lời giải thích của bạn;) Tôi đã bị một chút nhầm lẫn bởi các bình luận từ http://stackoverflow.com/questions/2272677/dependency-injection-in-grails-integration-tests "Các bài kiểm tra tích hợp không nên mở rộng GrailsUnitTestCase" . Không chắc chắn rằng tôi hoàn toàn có được sự khác biệt giữa GroovyTestCase và GrailsUnitTestCase ... – Wavyx

+1

Sự khác biệt lớn nhất (kết thúc là người cắn) là trường hợp kiểm tra đơn vị làm nhiều hơn trong cách chế nhạo và gây rối với metaClass khi thiết lập và tearDown. Mocking là một cái gì đó mà các bài kiểm tra tích hợp không cần vì họ đã có những thứ thực sự được tiêm vào. Nó cũng có nghĩa là khi các phép thử tích hợp kết thúc, nó sẽ hỏng cho tearDown thử nghiệm đơn vị được chạy vì nó có thể loại bỏ các thay đổi đối với metaClass (như các phương thức GORM động) được cho là có và các thử nghiệm tích hợp tiếp theo đang mong đợi. –

1

Tôi có một CustomerRegistrationServiceTest và CustomerRegistrationService của tôi phụ thuộc vào PasswordService.

CustomerRegistrationService tôi chỉ autowires nó như bình thường:

class CustomerRegistrationService { 
    def passwordService 

Trong CustomerRegistrationServiceTest của tôi, tôi có:

@TestFor(CustomerRegistrationService) 
@Mock(Customer) 
class CustomerRegistrationServiceTests extends GrailsUnitTestMixin { 

    void setUp() { 
     mockService(PasswordService) 
    } 

Vì vậy, khi tôi thử nghiệm các CustomerRegistrationService, nó có thể truy cập vào PasswordService

+1

Cảm ơn. Thật vậy, chế nhạo dường như là cách để đi, nhưng nhiều hơn cho một IMHO đơn vị thử nghiệm. Đối với các bài kiểm tra tích hợp, tôi muốn kiểm tra môi trường chính thức hơn. – Wavyx

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