gpt4 book ai didi

java - 使用 RedirectAttribute 的 Spring MVC 测试映射

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:50 24 4
gpt4 key购买 nike

我的问题与这些类似:

但是

给定一个 Controller 方法签名:

public String setupForm(
@ModelAttribute("notification") Notification n, RedirectAttributes redirect)

并进行测试(使用 Mockito):

@Mock
private AddNotificationController handler;
@Test
public void get() throws Exception{
request.setRequestURI("/addNotification/save.do");
request.setMethod("GET");
adapter.handle(request, response, handler);
verify(handler,times(1)).setupForm(any(Notification.class), any(RedirectAttributes.class));
}

执行时出现异常:

org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: 
Failed to invoke handler method [public java.lang.String ep.rdp.web.AddNotificationController.setupForm(a.b.c.Notification,org.springframework.web.servlet.mvc.support.RedirectAttributes)];
nested exception is java.lang.IllegalStateException:
Argument [RedirectAttributes] is of type Model or Map but is not assignable from the actual model.
You may need to switch newer MVC infrastructure classes to use this argument.

其实我知道这个问题,知道如何通过正确设置 spring 而不是在单元测试中解决。

所以问题是:我还必须在模拟中设置什么才能使其正常工作?

附加信息

基本设置模拟:

  @Before
public void setup() {
// adapter = new AnnotationMethodHandlerAdapter();
adapter = new RequestMappingHandlerAdapter();
request = new MockHttpServletRequest();
/*
* needed for AnnotationMethodHandlerAdapter when resolving controlle level mapping
*/
request.setAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, Boolean.TRUE);
response = new MockHttpServletResponse();
}

真实的

  • 在使用 AnnotationMethodHandlerAdapter 时出现这种症状。
  • 当我使用 RequestMappingHandlerAdapter 时,我得到:

    java.lang.ClassCastException: ep.rdp.web.CacheController$$EnhancerByMockitoWithCGLIB$$d8aab2c0 无法转换为 org.springframework.web.method.HandlerMethod 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)

最佳答案

也许我遗漏了关于你的问题的一些东西,但我不明白你为什么要创建一个 Controller 的模拟来测试它......我想那个 Spring 尝试用反射读取你的类 Controller 上的注释但是我无法在您的 mock 上正确使用反射。

我认为这不是测试映射的正确方法。 Spring 提供此模块来对您的 Controller 进行单元测试,并提供所有内容。所以你不应该在这里创建任何模拟。如果你想在你的真实对象上模拟一个方法,可能是一个@Spy(一个 spy 应用在真实对象上)。

你要做的是创建这样的东西:

@Before
public void setUp() {
this.mockMvc = MockMvcBuilders
.standaloneSetup(new AddNotificationController())
.build();
}

// and your test
@Test
public void testYourMethodName() {
this.mockMvc.perform(MockHttpServletRequestBuilder.get("/addNotification/save.do"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.handler().method("yourMethodName"))
.abdExpect(MockMvcResultMatchers.redirectedUrl("yourUrl"));
}

如您所见,您没有使用 mockito 提供的任何模拟对象,但我仍然检查请求是由方法“yourMethodName”处理的事实。如果您需要一些模拟,它应该在您的类 AddNotificationController 中。因此,在此类上使用 @InjectMock 并在此处创建 Controller 中使用的 @Mock 对象。我认为,这应该可以正常工作:

@Mock
public SomeService service;

@InjectMocks
public AddNotificationController controller = new AddNotificationController();

@Before
public void setUp() {
this.mockMvc = MockMvcBuilders
.standaloneSetup(this.controller)
.build();
}

PS:对不起我的英语。

关于java - 使用 RedirectAttribute 的 Spring MVC 测试映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11239520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com