2012-06-12 22 views
16

ứng dụng web của chúng tôi sử dụng SystemPropertyPlaceholder để tải file bất động sản phụ thuộc vào giá trị của một tài sản hệ thống (xem dưới đây)Set Hệ thống tài sản cho JUnit Runner (Eclipse) để thử nghiệm một mùa xuân Web App

Các thiết lập mặc định để chạy nó tại địa phương được lưu trữ trong application.properties. Trên máy chủ sản xuất, chúng tôi hiện chỉ đặt "env" thành "production" trước khi triển khai ứng dụng và nó sẽ tải production.properties.

Bây giờ để thử nghiệm ứng dụng, tệp test.properties sẽ được sử dụng.

Nếu tôi chạy tất cả các thử nghiệm nói trong bản dựng jenkins của chúng tôi, việc thêm -Denv=test sẽ hoạt động như mong đợi. Nhưng điều gì sẽ xảy ra nếu tôi chỉ muốn chạy một thử nghiệm duy nhất trong Eclipse với trình chạy JUnit tích hợp?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" }) 
public class SomeTest { 

Có cách nào để báo cho thử nghiệm của mình không nên đặt thuộc tính hệ thống "env" thành "test" TRƯỚC KHI Spring được tải lên? Bởi vì sử dụng MethodInvokingFactoryBean sẽ chỉ cài đặt nó sau đó vì một lý do, ngay cả khi tôi đặt nó trước khi tải các file tài sản của tôi:

<bean id="systemPrereqs" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" value="#{@systemProperties}" /> 
    <property name="targetMethod" value="putAll" /> 
    <property name="arguments"> 
     <!-- The new Properties --> 
     <util:properties> 
      <prop key="env">test</prop> 
     </util:properties> 
    </property> 
</bean> 

<bean 
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="searchContextAttributes" value="true" /> 
    <property name="contextOverride" value="true" /> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="locations"> 
     <list> 
      <value>classpath:application.properties</value> 
      <value>classpath:${env}.properties</value> 
      <value>${config}</value> 
     </list> 
    </property> 
</bean> 

<bean id="managerDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="username"> 
     <value>${database.username}</value> 
    </property> 
    <property name="password"> 
     <value>${database.password}</value> 
    </property> 
    <property name="url"> 
     <value>${database.url}</value> 
    </property> 

</bean> 

Với các thuộc tính cơ sở dữ liệu được định nghĩa bên trong application.properties, production.properties và test.properties. Điểm là, tất nhiên là tôi muốn sử dụng cùng một tệp ngữ cảnh cho tất cả các môi trường, nếu không tôi chỉ có thể nói với thử nghiệm của mình để sử dụng một ngữ cảnh khác nơi tôi đặt thuộc tính PropertyPlaceholder "location" thành test.properties .. Nhưng tôi muốn các bài kiểm tra của mình cũng bao gồm bối cảnh của mình để bất kỳ lỗi nào bị phát hiện càng sớm càng tốt (tôi đang thực hiện các bài kiểm tra kết thúc để kết thúc trên ứng dụng web của chúng tôi với spring-web-mvc tải lên toàn bộ ứng dụng web cung cấp một số thông tin phản hồi tốt đẹp ở đó và tôi không muốn mất điều đó).

Cho đến nay cách duy nhất tôi có thể nhìn thấy có thể là để cấu hình các Á hậu JUnit để bao gồm một số tài sản hệ thống thiết lập luận, mặc dù tôi không biết làm thế nào để làm điều đó ..

+0

tôi sẽ nói hồ sơ sử dụng trong những hồ sơ nhập khẩu hợp lý các tệp bạn cần. Có vẻ như bạn đang phát minh lại bánh xe. Với hồ sơ, bạn có thể chỉ cần thêm '@ ActiveProfiles' vào trường hợp thử nghiệm của mình để tải những thứ phù hợp. Thay vì od '-Denv = test', bạn sẽ sử dụng' -Dspring.active.profiles = test' –

Trả lời

33

tôi đang làm việc trên giống hệt nhau vấn đề bây giờ và hy vọng tìm thấy con đường. Bạn có thể gọi System.setProperty() vào bộ khởi tạo tĩnh của trường hợp thử nghiệm của bạn.

+0

Cool, hoạt động! Cảm ơn! :) – Pete

+1

Mặc dù điều này sẽ hoạt động khi chạy một thử nghiệm riêng lẻ, nhưng nó có thể không nhất thiết phải hoạt động khi chạy nhiều thử nghiệm, vì bối cảnh mùa xuân có thể được sử dụng lại trên nhiều thử nghiệm. – pimlottc

+0

@pimlottc, IMHO chạy nhiều kiểm tra không gây ra bất kỳ sự cố nào trong trường hợp này. Việc nắm bắt là chúng ta phải thiết lập thuộc tính hệ thống trước khi khởi tạo bối cảnh mùa xuân. Điều này đạt được bằng cách sử dụng bộ khởi tạo tĩnh. Nếu tất cả các trường hợp kiểm thử chia sẻ cùng một bối cảnh mùa xuân đã thiết lập thuộc tính này (có nghĩa là trường hợp) ngữ cảnh mùa xuân sẽ được khởi tạo đúng. – AlexR

16

Trong Eclipse, bấm chuột phải vào lớp kiểm tra JUnit, chọn Chạy dưới dạng> Chạy cấu hình ..., sau đó chuyển đến tab Đối số và trong Đối số VM, thêm vào mục nhập thuộc tính hệ thống, ví dụ: -Dcatalina.base = C: \ programs \ apache-tomcat-7.0.32

+3

Có cách nào để thực hiện điều này cho tất cả các bài kiểm tra theo mặc định, vì vậy bạn không phải tự thiết lập thuộc tính này cho mỗi bài kiểm tra? – Stewart

0

Bạn có thể thử sử dụng depends-on thuộc tính để có phương pháp gọi đậu chạy trước khi người khác

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