ứ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 đó ..
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' –