2012-06-06 4 views
5

У меня есть пользовательские теги JSPКак тестировать 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.

ответ

1

зависимостей Maven Java EE обеспечивает только пни, чтобы помочь компиляции кода которые требуют этих интерфейсов.Тепловая реализация обеспечивает выполнение, поэтому вы не можете их запускать. Вам нужно либо работать, чтобы издеваться над поведением (которое может в конечном итоге привести к рефакторингу вашего кода), либо вам необходимо провести функциональный запуск теста с помощью зависимая, которая обеспечивает полную реализацию API. Возможно, this answer может помочь.

0

Нил прав. Вам нужно высмеять ServletContext, если вы не хотите использовать полный javaee.jar.

0

Вы можете использовать mockito и/power mock для извлечения контекста сервлета и контекста jsp-страницы. Макет каждого метода, который ваш тег вызывает для правильной работы (doTag). Вам нужно добавить mocking framework и javax.el в качестве тестовых зависимостей.

Смежные вопросы