2013-03-22 29 views
5

Chúng ta có ứng dụng lớn được viết vào mùa xuân 3. Tôi cần viết hành vi kiểm tra kiểm tra JUnit của một số dịch vụ. Nó không phải là một đơn vị mà là một phần của một hệ thống. Có một số dịch vụ và kho lưu trữ cùng nhau làm việc với nhau -> rất nhiều đậu được tiêm bên trong. Ứng dụng này cũng sử dụng các khía cạnh.Thử nghiệm JUnit trong Spring - ghi đè và bỏ qua các hạt từ các lớp cấu hình ứng dụng khác

Câu hỏi của tôi là. Làm thế nào để quản lý cấu hình và đậu trong trường hợp thử nghiệm này? Tôi cần sử dụng các hạt được xác định trong cấu hình ứng dụng và trong các thử nghiệm chỉ xác định lại các hạt bằng cách sử dụng kiên trì để làm việc với một db được nhúng. Vì vậy, tôi cần phải sử dụng bean từ src khi chúng được định nghĩa và chỉ ghi đè lên một số rắc rối (bean bền bỉ, đậu bằng cách sử dụng webservices, ...) Trong gói thử nghiệm, tôi đã thực hiện lớp Config để định nghĩa bean cho persistence, sử dụng datasource cho hsql. Nhưng tôi không biết điều gì tiếp theo. Tôi đã cố gắng chú thích lớp Cấu hình thử nghiệm với:

@Configuration 
@EnableAspectJAutoProxy 
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true) 
@ComponentScan(basePackages = "com.example.our.app") 
public class MyTestConfig implements TransactionManagementConfigurer { 

để quét toàn bộ ứng dụng và sử dụng cấu hình của hạt từ thư mục src. Nhưng điều này cũng có cấu hình từ các thử nghiệm khác gây ra vấn đề. Đây có phải là toàn bộ chiến lược tốt hay không? Điều gì bây giờ - sử dụng excludeFilters để loại bỏ các cấu hình thử nghiệm khác? Hay chiến lược này là xấu?

cảm ơn

Trả lời

2

Tôi nghĩ cách tốt nhất để sử dụng là Spring profiles. Kiểm tra here now to use H2 for tests bằng hồ sơ.

+0

điểm Có tốt nhưng bạn sẽ phải để di chuyển cấu hình từ tệp applicationContext.xml sang java – vsingh

2

Bạn có thể ghi đè chọn lọc các bean bằng chức năng hợp nhất ngữ cảnh được cung cấp bởi chú thích @ContextHierarchy.

Để làm việc này đối với trường hợp sử dụng của bạn, bạn sẽ phải tạo ra một bối cảnh căn cứ quét ứng dụng của bạn cho đậu mùa xuân:

@Configuration 
@ComponentScan({"com.example.our.app"}) 
public class MyTestConfig implements TransactionManagementConfigurer { 

Sau đó tạo một lớp cơ sở mà sử dụng bối cảnh này và tên nó - điều này sẽ không hoạt động với các ngữ cảnh được đặt tên!:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextHierarchy({ 
    @ContextConfiguration(name="testContext", classes = MyTestConfig.class), 
}) 
public class BaseTest { 

Và cuối cùng viết một bài kiểm tra đơn vị đó mở rộng lớp cơ sở và định nghĩa một bối cảnh mới dưới cái tên tương tự để ghi đè lên đậu cá nhân với cấu hình thử nghiệm cụ thể:

@ContextHierarchy(@ContextConfiguration(name="testContext", classes = OneUnitTest.Config.class)) 
    public class OneUnitTest extends AggroBaseTest { 
     @Configuration 
     static class Config {  
      .. 
     } 
0

Bạn cũng có thể ghi đè với một khẩu

<beans> 
    <import resource="classpath*:applocationContext.xml" /> 
    <bean id="dataSourceFactory" class=com.demo.MyNewClass/> 
</beans> 

Và trong bạn lớp nếu bạn

this.applicationContext.getBean("dataSourceFactory"); 

lấy lớp, bạn sẽ thấy trường hợp của lớp mới

Tiếp tục

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

Vì vậy, có nhiều cách khác nhau mà bạn có thể ghi đè lên hành vi mặc định