Можно использовать M-y
после C-y
для вставки предыдущего объекта от кольца уничтожения или использования пакет browse-kill-ring .
Что касается второго вопроса, см. DeleteSelectionMode.
Сообщение об исключении относится к переменной "подачи" , которого нет в вашем примере кода, скорее всего, это вызвано тем, что вы нам не показали.
Кроме того, ваш тест тестирует Spring и ваш собственный код. Это действительно то, что вы хотите сделать?
Лучше предположить, что Spring работает (что он и делает), и просто протестировать свой собственный класс, то есть напрямую вызвать MyController.doSomething ()
. Который'
Я бы назвал то, что вам нужно, интеграционным тестом, основываясь на терминологии справочного руководства Spring. Как насчет того, чтобы сделать что-то вроде:
import static org.springframework.test.web.ModelAndViewAssert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({/* include live config here
e.g. "file:web/WEB-INF/application-context.xml",
"file:web/WEB-INF/dispatcher-servlet.xml" */})
public class MyControllerIntegrationTest {
@Inject
private ApplicationContext applicationContext;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private HandlerAdapter handlerAdapter;
private MyController controller;
@Before
public void setUp() {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
handlerAdapter = applicationContext.getBean(HandlerAdapter.class);
// I could get the controller from the context here
controller = new MyController();
}
@Test
public void testDoSomething() throws Exception {
request.setRequestURI("/test.html");
final ModelAndView mav = handlerAdapter.handle(request, response,
controller);
assertViewName(mav, "view");
// assert something
}
}
Для получения дополнительной информации я написал запись в блоге об интеграционном тестировании аннотаций Spring MVC.
Я обнаружил, что вы можете вручную вставить отображение PathVariable в объект запроса. Это явно не идеально, но, похоже, работает. В вашем примере что-то вроде:
@Test
public void test() {
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRequestURI("/test.html");
HashMap<String, String> pathvars = new HashMap<String, String>();
pathvars.put("id", "test");
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathvars);
new AnnotationMethodHandlerAdapter().handle(request, new MockHttpServletResponse(), new MyController());
// assert something
}
Мне определенно было бы интересно найти лучший вариант.
Я не уверен, что мой исходный ответ поможет с @PathVariable. Я только что попытался протестировать @PathVariable и получил следующее исключение:
org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: не удалось вызвать метод обработчика [public org.springframework.web.servlet.ModelAndView test .MyClass.myMethod (test.SomeType)]; вложенное исключение - java.lang.IllegalStateException: не удалось найти @PathVariable [имя параметра] в @RequestMapping
Причина в том, что переменные пути в запросе анализируются перехватчиком. Для меня работает следующий подход:
import static org.springframework.test.web.ModelAndViewAssert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:web/WEB-INF/application-context.xml",
"file:web/WEB-INF/dispatcher-servlet.xml"})
public class MyControllerIntegrationTest {
@Inject
private ApplicationContext applicationContext;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private HandlerAdapter handlerAdapter;
@Before
public void setUp() throws Exception {
this.request = new MockHttpServletRequest();
this.response = new MockHttpServletResponse();
this.handlerAdapter = applicationContext.getBean(HandlerAdapter.class);
}
ModelAndView handle(HttpServletRequest request, HttpServletResponse response)
throws Exception {
final HandlerMapping handlerMapping = applicationContext.getBean(HandlerMapping.class);
final HandlerExecutionChain handler = handlerMapping.getHandler(request);
assertNotNull("No handler found for request, check you request mapping", handler);
final Object controller = handler.getHandler();
// if you want to override any injected attributes do it here
final HandlerInterceptor[] interceptors =
handlerMapping.getHandler(request).getInterceptors();
for (HandlerInterceptor interceptor : interceptors) {
final boolean carryOn = interceptor.preHandle(request, response, controller);
if (!carryOn) {
return null;
}
}
final ModelAndView mav = handlerAdapter.handle(request, response, controller);
return mav;
}
@Test
public void testDoSomething() throws Exception {
request.setRequestURI("/test.html");
request.setMethod("GET");
final ModelAndView mav = handle(request, response);
assertViewName(mav, "view");
// assert something else
}
Я добавил в блог интеграцию, тестирующую аннотации Spring mvc