11

私はTDDに足を踏み入れようとしています。Mockito を MockMvc および Junit と組み合わせて使用​​して、コントローラーの単体テスト ケースを作成しようとしています。

しかし、実行時エラーが発生したため、テストに失敗しました。最初は、javax.servlet.SessionCookieConfig.

これは、API をダウンロードしjavax.servletてプロジェクトのビルド パスに構成することで解決しましたが、その後、

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

perform()MockMvc インスタンスで使用中。

互換性のないサーバー servlet-api と javax.servlet api が原因で発生していると思われるため、この種の依存関係をどうするか教えてもらえますか。

編集:私は単体テストに使用しているコードを投稿していますが、それは役に立たないと思いますが、念のために:

@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;
    }
}
4

6 に答える 6

11

これは、クラス パスに間違ったバージョンのサーブレット API があるように思えます。

がいつisAsyncStartedAPI に追加されたかを確認し、クラスパスで参照するものが少なくともそのバージョン以上であることを確認してください。

「間違った」クラス バージョンの発信元を見つけるには、次のコマンドを使用できます。

-verbose:class

Java の引数。ロードされたすべてのクラスがリストされ、正しく覚えていれば、それらがロードされる理由がわかりました。詳細については、 http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.htmlを参照してください。

于 2014-05-20T12:32:26.080 に答える
2

これは、開発環境と本番環境で異なるサーブレット API バージョンを使用している場合に発生します。

(たとえば) tomcat7 でビルドする場合、サーブレット 3 がサポートされるため、エラーは発生しません。

下位バージョンの tomcat で同じことを行うと、エラーがスローされます。

解決策:

サーブレット 3 をサポートするように環境の 1 つをアップグレードするか、サーブレット 2.5 を使用するようにコードをダウングレードしてください。

于 2014-05-20T12:40:47.260 に答える
1

エラー メッセージは、クラスパスに誤ったバージョンのサーブレット API があることを示しています。

Gradle を使用している場合は、

gradle dependencies

依存関係ツリーを分析し、バージョン 3.0 未満の「servlet-api」依存関係を除外します。除外するには、次の操作を実行できます

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

さらに servlet-api-2.x を含む複数の依存関係が存在する可能性があります。それらすべてを除外する

于 2016-02-16T21:25:34.690 に答える
0

エラーの解決策を見つけました。提供されていた実際のサーブレット API は gwt-servlet.jar のもので、gwt-servlet.jar 内のサーブレット API は古いバージョンのものでした。したがって、ビルド中にプロジェクトが最新の servlet-api を指すようにビルド パスを構成しました。

正解については、Jens がシナリオに最も近い解決策を示したので、私の投票は Jens に行くと思います。

みんな、ありがとう。:)

于 2014-05-23T06:39:06.960 に答える