java Spring MVC:如何从返回字符串的控制器方法对模型的属性进行单元测试?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/40120991/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring MVC: How to unit test Model's attribute from a controller method that returns String?
提问by user2652379
For example,
例如,
package com.spring.app;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(final Model model) {
model.addAttribute("msg", "SUCCESS");
return "hello";
}
}
I want to test model
's attribute and its value from home()
using JUnit. I can change return type to ModelAndView
to make it possible, but I'd like to use String
because it is simpler. It's not must though.
我想使用 JUnit测试model
的属性及其值home()
。我可以将返回类型更改ModelAndView
为使其成为可能,但我想使用String
它,因为它更简单。但这不是必须的。
Is there anyway to check model
without changing home()
's return type? Or it can't be helped?
无论如何要检查model
而不更改home()
的返回类型?还是无能为力?
回答by Sergii Getman
You can use Spring MVC Test:
您可以使用Spring MVC 测试:
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(model().attribute("msg", equalTo("SUCCESS"))) //or your condition
And hereis fully illustrated example
而在这里充分说明例子
回答by user2652379
I tried using side effect to answer the question.
我尝试使用副作用来回答这个问题。
@Test
public void testHome() throws Exception {
final Model model = new ExtendedModelMap();
assertThat(controller.home(model), is("hello"));
assertThat((String) model.asMap().get("msg"), is("SUCCESS"));
}
But I'm still not very confident about this. If this answer has some flaws, please leave some comments to improve/depreciate this answer.
但我对此仍然不是很有信心。如果这个答案有一些缺陷,请留下一些评论来改进/贬低这个答案。
回答by mh-dev
You can use Mockito for that.
你可以使用 Mockito。
Example:
例子:
@RunWith(MockitoJUnitRunner.class)
public HomeControllerTest {
private HomeController homeController;
@Mock
private Model model;
@Before
public void before(){
homeController = new HomeController();
}
public void testSomething(){
String returnValue = homeController.home(model);
verify(model, times(1)).addAttribute("msg", "SUCCESS");
assertEquals("hello", returnValue);
}
}