barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 22 марта 2013 г.

Maven и unit-тестирование классов, использующих servlet-api

Проблема:

Имеется maven-проект веб-приложения, у него есть следующая зависимость:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
Есть некий класс, использующий servlet-api (расширующий HttpServlet). Для него написан unit-тест, при попытке выполнить который валится ошибка:
org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Caused by: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/http/HttpServlet
at java.lang.ClassLoader.defineClass1(Native Method)
...
Причина:

javaee-web-api не может быть использован при выполнении java-кода, т.к. не содержит тел методов.

Решение:

Добавить test-зависимость, содержащую имплементацию servlet-api, например:
<dependency>
<groupId>tomcat</groupId>
<artifactId>servlet</artifactId>
<version>4.1.36</version>
<scope>test</scope>
</dependency>

Комментариев нет:

Отправить комментарий