2014-06-12 15 views
9
class MyWebAppInitializer extends WebApplicationInitializer { 
    def onStartup(servletContext: ServletContext): Unit = { 
     ... 
    } 
} 

@RunWith(classOf[SpringJUnit4ClassRunner]) 
@WebAppConfiguration 
@ContextConfiguration(classes = Array(classOf[MyConfig]), 
    initializers=Array(classOf[MyWebAppInitializer]))  // <<< ERROR 
class MyTest { 
    ... 
} 

Than phiền về:Làm thế nào để chạy thử nghiệm bằng cách sử dụng một WebApplicationInitializer tùy chỉnh?

annotation argument needs to be a constant; found: classOf[MyWebAppInitializer] 

UPDATE: @M. Deinum chỉ ra rằng chỉ có ApplicationContextInitializers được cho phép ở đây - do đó, lỗi là một loại báo cáo không đúng.

Vậy ... làm cách nào tôi có thể sử dụng MyWebAppInitializer của riêng mình theo thứ tự và kiểm tra chức năng được xác định trong đó?

+0

Bạn có thể cung cấp 'ApplicationContextInitializer' không 'WebApplicationInitializer'. Xem http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html#initializers-- –

+0

Khá đúng (mặc dù tôi tuyệt vọng tại báo cáo lỗi của Scala, do tôi cung cấp value _is_ hằng số, nhưng lỗi là kiểu không khớp). Vì vậy, làm thế nào để bắt đầu thử nghiệm của tôi với một WebApplicationInitializer tùy chỉnh - Spring cung cấp khả năng tùy chỉnh onStartup của nó (và mọi người thường xuyên làm). Có cách nào để kiểm tra tùy chỉnh này trong các bài kiểm tra đơn vị không? – user48956

+0

Đã cập nhật câu hỏi để phản ánh vấn đề còn lại - cách kiểm tra WebApplicationInitializer. – user48956

Trả lời

8

Trong cấu hình ngữ cảnh của bạn, tôi không thấy rằng bạn có trình tải ngữ cảnh được liệt kê. AnnotationConfigWebContextLoader sẽ xác định vị trí các trường hợp của WebApplicationInitializer trên đường dẫn lớp của bạn, bằng cách thêm và loại bỏ trình intializers (mà bạn đã lưu ý là dành cho ApplicationContextInitializers chứ không phải là WebApplicationInitializers) thì bạn nên đặt tất cả.

@RunWith(classOf[SpringJUnit4ClassRunner]) 
@WebAppConfiguration 
@ContextConfiguration(classes = {ConfigClass.class, AnotherConfigClass.class}, loader=AnnotationConfigWebContextLoader.class)) 
class MyTest { 
... 

Dưới đây là một ví dụ làm việc

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes={WebConfiguration.class, SecurityConfig.class}, loader=AnnotationConfigWebContextLoader.class) 
@ActiveProfiles("dev") 
public class AppTests { 
    private MockMvc mockMvc; 

    @Autowired 
    protected WebApplicationContext webApplicationContext; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    } 

    @Test 
    public void simple() throws Exception { 
     mockMvc.perform(MockMvcRequestBuilders.get("/")) 
       .andExpect(MockMvcResultMatchers.status().isOk()) 
       .andExpect(MockMvcResultMatchers.view().name("index")); 
    } 
} 
1

Câu trả lời là "Xin lỗi, bạn không thể". Bạn có thể tham khảo này: Spring FrameworkSPR-10199 Add capability to use WebApplicationInitializer for testing Spring web applications

Cũng như Sam Brannen nói:

Mặc dù mùa xuân không cung cấp mocks cho API Servlet, mùa xuân không không thử một container Servlet và hiện không có ý định. Spring luôn tập trung vào thử nghiệm tích hợp vùng chứa. Hoàn toàn chế nhạo một thùng chứa do đó vượt ra ngoài phạm vi hỗ trợ thử nghiệm của mùa xuân . Vui lòng xem các nhận xét từ Rossen và tôi ở trên để biết thêm chi tiết .

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