С RestEasy в контейнере JBoss у меня есть ExceptionMapper
с аннотацией @Provider
, которая имеет доступ к аннотациям HttpServletRequest
и HttpServletResponse
через @Context
, например:
@Provider
public class MyExceptionMapper implements ExceptionMapper<Throwable> {
@Context
private HttpServletRequest httpServletRequest;
@Context
private HttpServletResponse httpServletResponse;
@Override
public Response toResponse(final Throwable exception) {
...
return response;
}
}
Я новичок в RestEasy, родом из Spring, поэтому наивно полагал, что смогу внедрить эти два поля и подделать их в модульном тесте, но это кажется сложнее, чем я ожидал!
В случае, если фреймворк уместен, я использую JMockit, и я тоже новичок в этом. До сих пор мне удавалось применить мои знания о Mockito с хорошим успехом.
Я не нахожу многого в поиске по теме, кроме множества предложений по запуску встроенного контейнера в моих модульных тестах. Я не полностью против этого, но мне кажется, что это излишне, когда я просто пытаюсь написать простой модульный тест.
Я попробовал несколько вещей в тесте, совсем недавно это:
public class MyExceptionMapperTest {
@Injectable
private HttpServletRequest httpServletRequest;
@Injectable
private HttpServletResponse httpServletResponse;
@Tested
private MyExceptionMapper exceptionMapper;
@Test
public void test() {
exceptionMapper.toResponse(new Throwable());
}
}
Но это приводит к NullPointerException
в MyExceptionMapper
при первом обращении к одному из полей @Context
, которое говорит мне, что они не вводятся.
Я также пробовал:
- с использованием
@Mocked
вместо @Injectable
;
- непосредственное создание экземпляра
MyExceptionMapper
как с аннотацией @Tested
, так и без нее;
- создает
Expectations
в моем тесте; и
- каждая перестановка выше
Во всех случаях @Context
-аннотированные поля имеют значение null
.
Надеюсь, я просто упускаю что-то очень очевидное?