2014-05-20 15 views
5

Tôi đang cố gắng làm ướt chân bằng TDD. Tôi đang cố gắng viết các trường hợp kiểm thử đơn vị cho các bộ điều khiển sử dụng Mockito kết hợp với MockMvc và Junit.java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() trong khi sử dụng Mockito với Junit

Nhưng tôi gặp lỗi thời gian chạy do đó không thực hiện được thử nghiệm của mình. Lúc đầu, tôi đã phải đối mặt với vấn đề trong việc khởi tạo các MockMvc dụ trong các thiết lập do thất bại trong việc tìm kiếm các javax.servlet.SessionCookieConfig.

tôi này được giải quyết bằng cách tải về javax.servlet api và cấu hình nó vào việc xây dựng con đường của dự án nhưng sau đó tôi đang phải đối mặt với

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() 

khi sử dụng perform() trên dụ MockMvc.

Bất cứ ai có thể cho tôi biết phải làm gì với loại phụ thuộc như tôi nghĩ rằng nó đang xảy ra do máy chủ không tương thích servlet-api và javax.servlet api.

EDIT: Tôi gửi bài mã Tôi đang sử dụng sử dụng cho kiểm tra đơn vị nhưng tôi không nghĩ rằng nó sẽ được bất kỳ sự giúp đỡ nhưng chỉ trong trường hợp:

@RunWith(MockitoJUnitRunner.class) 
public class MyControllerTest { 

    @InjectMocks 
    private MyController myController = new MyController(); 

    @Mock 
    private MyService myService = new MyServiceImpl(); 

    private MockMvc mockMvc; 

    @Before 
    public void setUp(){ 
     this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build(); 
    } 

    @Test 
    public void testList() throws Exception{ 
     A a = new A(); 
     a = createMockClassA(); 

     Mockito.when(myService.getServiceForA(Mockito.anyMapOf(String.class, String.class))).thenReturn(a); 

     MvcResult result = this.mockMvc.perform(get("/somePath/")).param("someExpectedParam","value").andReturn(); 

     System.out.println(result.getResponse().getContentAsString()); 

    } 



    private static A createMockClassA(){ 
     A a = new A(); 
     a.setId(i); 
     a.setTitle("mock-" + i); 
     return a; 
    } 
} 

Trả lời

7

Điều này nghe rất nhiều như bạn có sai phiên bản API servlet trong đường dẫn lớp.

Kiểm tra khi nào isAsyncStarted được thêm vào API và đảm bảo rằng bạn tham chiếu trong đường dẫn lớp của bạn ít nhất là phiên bản đó hoặc cao hơn.

Để tìm vị trí nơi mà các phiên bản 'sai' lớp được đến từ bạn có thể sử dụng Đối số

-verbose:class 

cho java. Nó sẽ liệt kê tất cả các lớp được nạp và nếu tôi nhớ chính xác thì chúng sẽ được tải từ đó. Xem http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html để biết chi tiết.

+0

Hi Jens, Tôi đã kiểm tra API isAsyncStarted đã được thêm vào trong servlet 3.0 và tôi đang sử dụng java.servlet-3.0.jar trong dự án xây dựng của mình. – Sourabh

+0

Thats ok để phát triển. Kiểm tra xem máy chủ có sử dụng cùng cấp api servlet không. –

+0

Máy chủ có cùng cấp api servlet. – Sourabh

1

Điều này xảy ra khi môi trường phát triển và sản xuất của bạn đang sử dụng các phiên bản API servlet khác nhau.

Trong khi xây dựng với tomcat7 (ví dụ) nó hỗ trợ servlet 3 và do đó bạn sẽ không nhận được bất kỳ lỗi nào.

Trong khi thực hiện tương tự trên phiên bản tomcat thấp hơn, nó sẽ phát hiện lỗi.

Giải pháp:

Hoặc nâng cấp một trong những môi trường để hỗ trợ servlet 3 hoặc chỉ hạ cấp mã của bạn để sử dụng servlet 2.5

+0

Hi Manish, tôi nghĩ về cùng một nhưng gây sốc tôi đã sử dụng apache tomcat 7.0.40 và javax.servlet-3.0.jar. Tôi không thể hạ cấp javax servlet xuống 2.5 vì nó không chứa lớp SessionCookieConfig. Vì vậy, việc nâng cấp tomcat sẽ là một lựa chọn nhưng nó đã ở phiên bản tương thích. – Sourabh

0

Tôi tìm thấy giải pháp cho lỗi của tôi. Api servlet thực tế đã được cung cấp là của gwt-servlet.jar và servlet-api trong gwt-servlet.jar là của phiên bản cũ hơn. Vì vậy, tôi đã cấu hình đường dẫn xây dựng của mình để làm cho dự án trỏ tới servlet-api mới nhất trong khi xây dựng.

Đối với câu trả lời đúng, tôi nghĩ rằng phiếu bầu của tôi sẽ được chuyển đến Jens kể từ khi ông đưa ra giải pháp gần nhất theo kịch bản.

Cảm ơn mọi người. :)

+0

Cảm ơn. Nó hoạt động với servlet-api.jar 3.0.1 mà không có bất kỳ vấn đề nào. – rakeeee

1

Thông báo lỗi cho biết bạn có phiên bản Servlet API sai trong đường dẫn lớp của bạn.

Nếu bạn đang sử dụng Gradle execute

gradle dependencies 

phân tích cây phụ thuộc và loại trừ 'servlet-api' phụ thuộc với phiên bản thấp hơn 3.0. Bạn có thể làm như sau để loại trừ

compile ('javax.servlet:jsp-api:2.0'){ 
    exclude module : 'servlet-api' 
} 

Có thể có nhiều phụ thuộc bao gồm servlet-api-2.x. Loại trừ tất cả những

+0

Cảm ơn, đây là giải pháp trong trường hợp của tôi. org.apache: storm-core sử dụng servlet-api 2.5 nhưng io.confluent: kafka-schema-registry sử dụng servlet-api 3.1. Tôi phải loại trừ sự phụ thuộc từ cơn bão để làm cho mã của tôi hoạt động. – asmaier

0

tôi giải quyết vấn đề này bằng cách thêm vào Java Build Path tomcat như một thư viện máy chủ thời gian chạy

mockito javax.servlet.SessionCookieConfig problem

0

tôi đã có một vài vấn đề tương tự của các bài kiểm tra Junit của tôi đã không làm việc (trong IntelliJ IDEA) và tôi cũng nhận được java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.... cho các bài kiểm tra đơn vị đó. Khi tôi cố gắng biên dịch dự án hoàn thành bằng cách sử dụng gradle từ thư mục thông qua dấu nhắc lệnh bằng cách sử dụng lệnh gradle clean build thì mã đã được biên dịch thành công. Trong khi vấn đề là với các bài kiểm tra Junit trong ý tưởng Intellij thì họ đã cho thấy lỗi được đề cập ở trên. Tôi chỉ đơn giản là thay đổi phiên bản gradle của tôi từ 3.4.1 đến 2.1.3. Tôi không biết tại sao các bài kiểm tra Junit của tôi đang biên dịch cũng như mã của tôi đang được biên dịch thông qua intellij cũng như thông qua dấu nhắc lệnh. Cùng một vấn đề xảy ra với một đồng nghiệp của tôi và ông cũng thay đổi phiên bản gradle từ 4 đến một số phiên bản của 2. Vấn đề đã được giải quyết.

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