2010-05-19 23 views
13

Tôi có một thư viện Java tương đối nhỏ, triển khai một vài chục bean (không có cơ sở dữ liệu hoặc GUI). Tôi đã tạo một tệp cấu hình Spring Bean mà các dự án Java khác sử dụng để tiêm đậu của tôi vào công cụ của họ.Làm thế nào để tạo TestContext cho Spring Test?

Tôi bây giờ là lần đầu tiên thử sử dụng Spring Test để tiêm một số loại đậu này vào các lớp thử nghiệm junit của tôi (thay vì chỉ đơn giản là tạo ra chúng).

Tôi đang làm điều này một phần để tìm hiểu Spring Test và một phần để buộc các bài kiểm tra sử dụng cùng một tệp cấu hình bean mà tôi cung cấp cho người khác.

Trong tài liệu hướng dẫn Spring, tôi cần tạo ngữ cảnh ứng dụng bằng cách sử dụng lớp "TestContext" đi kèm với Spring. Tôi tin rằng điều này nên được thực hiện trong một tệp XML mùa xuân mà tôi tham chiếu qua chú thích @ContextConfiguration trên lớp thử nghiệm của tôi.

@ContextConfiguration({"/test-applicationContext.xml"}) 

Tuy nhiên, không có gợi ý về nội dung cần đưa vào tệp!

Khi tôi chạy các thử nghiệm của mình từ bên trong Eclipse, có lỗi cho biết "không tải được Ngữ cảnh ứng dụng" .... tất nhiên.

Cập nhật:

Đây là thử nghiệm applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <description>Holds application context for testing of the domain module.</description> 

    <!-- Imports the uuid generator bean definitions --> 
    <import resource="resources/domain-uuid.xml"/> 
</beans> 

thư mục dự án của tôi là như thế này:

domain/ 
    src/ 
     main/ 
     java/ 
     resources/ 
     test/ 
     java/ 
     resources/ (location of test-applicationContext.xml) 

Just for fun Tôi cũng đã cố gắng để xây dựng từ dòng lệnh mvn qua "mvn clean test" và tôi nhận được các lỗi sau đây có thể là vấn đề thực sự của tôi:

package org.springframework.test.context does not exist 

package org.springframework.test.context.junit4 does not exist 

cannot find symbol 
symbol: class ContextConfiguration 
@ContextConfiguration({"/resources/test-applicationContext.xml"}) 

cannot find symbol 
symbol: class SpringJUnit4ClassRunner 
@RunWith(SpringJUnit4ClassRunner.class) 

Trả lời

10

Nội dung cần đưa vào tệp ngữ cảnh ứng dụng. Cách khung TestContext hoạt động là nó cho phép bạn sử dụng lại hệ thống dây điện ứng dụng trong ngữ cảnh của các bài kiểm tra tích hợp của bạn. Vì vậy, đối với hầu hết các phần, không có bất kỳ điều gì đặc biệt đối với các thử nghiệm bạn đặt bên trong tệp cấu hình ngữ cảnh của ứng dụng. Nếu bộ điều khiển của bạn có sự phụ thuộc vào dịch vụ trong ứng dụng của bạn, thì nó cũng sẽ có trong kiểm thử tích hợp của bạn. Nếu DAO của bạn có một SessionFactory trong ứng dụng của bạn, sau đó tương tự cho thử nghiệm tích hợp của bạn. Bằng cách đó bạn không cần phải nối tất cả những thứ đó lên một lần nữa khi bạn viết các bài kiểm tra tích hợp. Rất tuyệt.

Tôi đã nói đối với hầu hết các phần ở trên vì có ít nhất một ngoại lệ xuất hiện trong đầu bạn. Thông thường ứng dụng của bạn sẽ sử dụng JNDI để định vị một DataSource, nhưng trong một thử nghiệm tích hợp (ít nhất là một thử nghiệm tích hợp ngoài container), bạn sẽ không bình thường có một môi trường JNDI có sẵn. Vì vậy, bạn nên thường tách riêng việc tạo bean DataSource thành một tệp riêng biệt và sử dụng phiên bản JNDI cho ứng dụng trực tiếp của bạn và phiên bản không phải JNDI (ví dụ: chỉ cần tạo một bài kiểm tra tích hợp BasicDataSource thẳng). Dưới đây là một ví dụ của cựu:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/> 

và đây là một ví dụ về sau:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" 
    p:driverClassName="${dataSource.driverClassName}" 
    p:url="${dataSource.url}" 
    p:username="${dataSource.username}" 
    p:password="${dataSource.password}" /> 

Những sẽ đi trong các tập tin riêng biệt. Việc đầu tiên có thể đi trong beans-datasource.xml để sử dụng ứng dụng thông thường và thứ hai trong beans-datasource-it.xml cho các bài kiểm tra tích hợp.Cấu hình phổ biến cho các thử nghiệm sử dụng và tích hợp ứng dụng thông thường (nghĩa là phần lớn cấu hình bean của bạn trong hầu hết các trường hợp) phải nằm trong tệp hoặc tệp cấu hình chung.

Ngoài ra, mùa xuân 3 giới thiệu một jdbc namespace mới cho phép bạn tạo một cơ sở dữ liệu nhúng, giống như một cơ sở dữ liệu HSQLDB hoặc một cơ sở dữ liệu Derby, vv Nó trông như thế này:

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:hsql/schema.sql" /> 
    <jdbc:script location="classpath:hsql/test-data.sql" /> 
</jdbc:embedded-database> 

Điều đó sẽ thay thế BasicDataSource cấu hình được mô tả ở trên, nếu bạn muốn sử dụng.

Tại sao lỗi xảy ra. Lỗi bạn đang thấy đang xảy ra vì giá trị @ContextConfiguration của bạn ngầm cho biết rằng tệp ngữ cảnh ứng dụng phải nằm trên đường dẫn lớp. QUAN TRỌNG: Xóa đoạn /resources. Đó là nội bộ của Maven; khi nó xây dựng JAR hoặc WAR của bạn, nó sao chép nội dung của thư mục resources vào đường dẫn classpath của bạn, chứ không phải resources chính nó. Điều đó sẽ giúp ích.

EDIT:

Để giải quyết "không có biểu tượng tìm thấy" lỗi, bạn sẽ cần phải thêm phụ thuộc thử nghiệm của bạn Maven bạn POM. Đây sẽ là mô-đun JUnit và Spring Test, cả hai đều có <scope>test</scope>. Ngoài ra nếu bạn đang sử dụng một khuôn khổ giả như Mockito, bạn sẽ cần thêm phụ thuộc đó (với phạm vi kiểm tra) vào POM của bạn. Hãy thử điều đó và vui lòng báo cáo lại những gì xảy ra.

+0

Xin lỗi - tôi không sử dụng JNDI hoặc DAO. Tôi chỉ không biết nơi để tạo textContext! Bạn nói "tệp ngữ cảnh ứng dụng" - đó là gì? – HDave

+0

"Tệp ngữ cảnh ứng dụng" chỉ là tệp XML cấu hình Spring của bạn. Cái có phần tử cấp cao nhất. Bạn có thể đặt nó trực tiếp dưới WEB-INF, hoặc bạn có thể đặt nó trên classpath, như dưới src/test/resource như bạn đã nói trong một trong các bình luận khác của bạn. Nó có thể giúp bạn thêm cấu trúc thư mục của bạn (các phần có liên quan) vào bài đăng gốc của bạn và cũng hiển thị tệp test-applicationContext.xml của bạn. –

+1

OK - Tôi nghĩ mình đã hiểu. Tôi không phải chỉ định TestContext ở bất cứ đâu. Mùa xuân chỉ "biết" bằng cách nào đó (như thế nào ???). Vấn đề là Spring không thể tìm thấy tập tin cấu hình của tôi. – HDave

6

Để tìm nó trực thuộc src/kiểm tra/nguồn lực, thay đổi nó để:

@ContextConfiguration({"classpath:/test-applicationContext.xml"}) 

Khi bạn không chỉ định bất cứ điều gì, sau đó tìm kiếm mùa xuân trong gói giống như lớp thử nghiệm.

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