2012-02-17 29 views

Trả lời

14

Không có hỗ trợ cho truy vấn HQL trong các bài kiểm tra đơn vị, nhưng chúng tôi đang làm việc trên đó. Nhưng bạn không nên làm các xét nghiệm kiên trì với mocks. Kiểm tra sự bền bỉ nên được thực hiện đối với một cơ sở dữ liệu trong một thử nghiệm tích hợp.

Tôi thường di chuyển truy vấn HQL đến lớp miền dưới dạng phương thức truy vấn tĩnh. Bằng cách này, họ dễ dàng thử nghiệm trong một bài kiểm tra đơn vị của một bộ điều khiển, dịch vụ, vv và sau đó tôi thử nghiệm phương thức này như một phần của bài kiểm tra tích hợp lớp miền.

Ví dụ tôi muốn có

class User { 
    String username 
    String password 
    ... 

    static List findAllUsersBlahBlah(String foo, boolean bar) { 
     executeQuery('from User u where ...') 
    } 
} 

Sau đó, trong một thử nghiệm đơn vị tôi có thể chế nhạo rằng phương pháp với dữ liệu giả kể từ khi tôi không quan tâm đến sự kiên trì trong một thử nghiệm đơn vị điều khiển - Tôi biết rằng nó được kiểm tra đúng cách ở địa điểm chính xác và tôi muốn tập trung vào các lớp dưới kiểm tra, không cộng tác viên của nó:

def users = [new User(...), new User(...)] 
User.metaClass.static.findAllUsersBlahBlah = { String foo, boolean bar -> users } 
+0

Cảm ơn, mà thực sự giúp – LiCheng

+0

tôi đã cố gắng giải pháp khác đầu tiên nhưng cuối cùng phải sử dụng cái này, nhờ việc chuyển đổi metaclassing –

+0

có thể gây ra các vấn đề khác nếu bạn không làm sạch sau khi sử dụng. bạn đã được cảnh báo. –

8

Chúng tôi đã chế giễu thành công executeQuery với Grails 2.0 trong dự án của chúng tôi

@TestFor(BookController) 
@TestMixin([DomainClassUnitTestMixin,ServiceUnitTestMixin]) 
@ConfineMetaClassChanges([Book]) 
class BookControllerSpec extends Specification{ 
    mockDomain(Book) 
    Book.metaClass.static.executeQuery = {a,b,c-> return [Book]} 
+0

Cảm ơn bạn rất nhiều. – LiCheng

+0

Xin đừng quên chấp nhận (bỏ phiếu) câu trả lời nếu nó hoạt động và giúp bạn :) – Saurabh

0

Trong Grails 2.5.4 bạn có thể sử dụng GroovyMock cho mocking phương pháp tĩnh thực hiện trong Java:

GroovyMock(Book, global: true) 

tôi chỉ thử nghiệm - nó cũng làm việc cho _.executeQuery()

+0

Bạn có thể vui lòng cung cấp một bài kiểm tra đơn vị mẫu thực hiện việc này không. –