2011-08-12 23 views
6

Chúng tôi có nguồn dữ liệu tùy chỉnh mở rộng BasicDataSource. Chúng tôi đã ghi đè phương thức getConnection, một vài thứ bên trong nó. Khi chúng tôi chạy webapp bên ngoài thử nghiệm, khi chúng tôi gọi một dịch vụ từ một bộ điều khiển, nó sẽ lấy một kết nối mới và sử dụng kết nối đó cho đến khi dịch vụ được thực hiện. Tất cả đều tốt. Tuy nhiên, bên trong một thử nghiệm tích hợp, kết nối dường như được nắm lấy trước khi kiểm tra thậm chí gọi bộ điều khiển. Chảy bên dướiGrails Connections hoạt động rất khác nhau trong kiểm tra tích hợp

Regular Run: điều khiển cuộc gọi -> điều khiển gọi phương thức dịch vụ -> kết nối được nắm lấy -> Phương pháp dịch vụ được điều hành và trả lại để điều khiển

Integration Test: kết nối được nắm lấy -> điều khiển cuộc gọi từ thử nghiệm -> Bộ điều khiển gọi phương thức dịch vụ -> phương thức dịch vụ được chạy và trả về bộ điều khiển

Không cần phải nói, điều này khiến chúng tôi gặp vấn đề khi kết nối đúng là rất quan trọng đối với ứng dụng của chúng tôi. Suy nghĩ?

Chỉnh sửa: Vẫn gặp sự cố nghiêm trọng với vấn đề này. Chúng tôi đã đạt đến một điểm mà chúng ta phải tránh tạo ra các xét nghiệm hội nhập, hoặc làm một số chuyển đổi kết nối bằng tay (mà đánh bại nửa điểm của các bài kiểm tra)

DataSource.groovy

dataSource { 
pooled = true 
dialect="org.hibernate.dialect.OracleDialect" 
properties { 
    maxActive = 50 
    maxIdle = 10 
    initialSize = 10 
    minEvictableIdleTimeMillis = 1800000 
    timeBetweenEvictionRunsMillis = 1800000 
    maxWait = 10000 
    testWhileIdle = true 
    numTestsPerEvictionRun = 3 
    testOnBorrow = true 
} 

} 
hibernate { 
cache.use_second_level_cache = true 
cache.use_query_cache = true 
cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 
} 
+0

là u đang triển khai ControllerUnitTestCase? hay chỉ là UnitTestCase ?! –

+0

ControllerUnitTestCase – Joseph

+0

Bạn có thể đăng tệp DataSource.groovy của mình không? –

Trả lời

2

Đây không phải là một trận chung kết câu trả lời, tuy nhiên tôi tin rằng đây là một lời giải thích về những gì đang xảy ra:

  • Chạy như ứng dụng Web: lớp dịch vụ của bạn có một transactionManager trong đó có một sessionfactory, mà được kết nối! Vì vậy, trong trường hợp này, giả định rằng bạn Service là 'transactional = true' tất cả các phương thức mà bạn gọi trong các dịch vụ của bạn sẽ có một 'Session.beginTransaction()' ở đầu phương thức (có một Grails `s Proxy để làm điều đó , khi bạn đặt 'transactional = true'), nó sẽ gọi tất cả stack đó cho đến khi getConnection().

  • Chạy dưới dạng thử nghiệm tích hợp: vì Grails không cam kết DB của bạn thay đổi, nên luôn luôn khôi phục chúng! Tôi tin rằng khi bạn bắt đầu thử nghiệm Tích hợp của bạn, grails đang tạo ra một giao dịch ngay lập tức! do đó, nó sẽ có thể rollback nó sau đó! (mà làm cho cảm giác hoàn toàn đúng!), bạn có thể xác nhận rằng hãy xem các lớp học org.codehaus.groovy.grails.test.support.GrailsTestInterceptor. Phương thức init() được gọi trước các dịch vụ của bạn trong bài kiểm tra tích hợp của bạn. Vì vậy, đó là lý do tại sao getConnection() đang được gọi trước mọi thứ!

Đề xuất: Bạn có thể thử thiết lập lớp thử nghiệm hội nhập của bạn là 'giao dịch = false' và xem nếu getConnection() không được gọi trong đầu! Chuyển đến phần Giao dịch trong here để xem thêm! Chỉ cần không quên rằng trong thử nghiệm của bạn, bạn sẽ phải quay trở lại giao dịch của bạn! nếu giao dịch của bạn được đặt = false.

+1

Tôi chắc chắn sẽ cung cấp cho một thử sau ngày hôm nay khi tôi nhận được thời gian. – Joseph

+0

Xin lỗi, tôi đã rất bận với lỗi. Hy vọng rằng tôi sẽ có thời gian hôm nay :) – Joseph

+0

Điều này dường như là vấn đề với những gì đang xảy ra. Kể từ khi nó đã có một kết nối nó không cố gắng lấy một cái mới. Cảm ơn một loạt sự giúp đỡ. – Joseph

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