5

カスタム JSP タグがあります

public class HappyTag extends TagSupport { ... }

そして今、私はそれをテストする必要があります。

そこで、簡単な JUnit テストを作成しました。

@Test
public void testTag() {
    HappyTag tag = new HappyTag();
}

次のエラーが表示されます。

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/jsp/tagext/TagSupport
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
(.....)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

タグを含めて、アプリケーションのビルドとテストに maven を使用しています。タグサブモジュールの現在の依存関係は次のとおりです。

    <dependencies>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

さらに、親モジュールからのいくつかの依存関係:

   <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>


    <dependency>
        <groupId>javax.portlet</groupId>
        <artifactId>portlet-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.portletfaces</groupId>
        <artifactId>portletfaces-bridge-impl</artifactId>
        <version>2.0.0</version>
    </dependency>


    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

これらの依存関係は、JSP でタグをコンパイルして使用するのに十分です。タグをテストするのに十分ではありません:-(

それで、私は何を間違えましたか?

よろしくお願いします、
Q.

4

3 に答える 3

1

Java EE Maven の依存関係は、これらのインターフェースを必要とするコードのコンパイルを支援するスタブのみを提供します。IT は実装を提供しません。したがって、それらを実行することはできません。動作をモックするために回避する必要があります (コードを大幅にリファクタリングする可能性があります)。または、API の完全な実装を提供する依存関係を使用して機能的にテストを実行する必要があります。たぶん、この答えが役立つかもしれません。

于 2014-02-24T21:35:04.187 に答える
0

mockito や power mock を使用して、サーブレット コンテキストと jsp ページ コンテキストをモックできます。タグが適切に機能するように各メソッドをモックします (doTag)。テストの依存関係として、モック フレームワークと javax.el を追加する必要があります。

于 2015-10-22T20:37:59.937 に答える
0

ニールは正しい。完全な javaee.jar を使用したくない場合は、ServletContext をモックする必要があります。

于 2014-02-24T21:52:00.980 に答える