我试图让单元测试成为一个简单的GET控制器方法,应用MockMvc.perform方法,但当控制器收到请求时,方法Mockito.when似乎无法管理MenuService的方法调用,测试抛出异常。异常表示menuServiceMock为空我正在使用Mockito MockMvc JUnit
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import edu.AG.LandingPageSanpietro.domain.Menu;
import edu.AG.LandingPageSanpietro.service.MenuService;
import java.util.Arrays;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
class MenuControllerTest {
private MockMvc mockMvc;
@Autowired
private MenuService menuServiceMock;
@Test
public void testHomeController1() throws Exception {
Menu first=new Menu("titolo1","descrizione1","filename1");
Menu second=new Menu("titolo2","descrizione2","filename2");
Mockito.when(menuServiceMock.getMenus()).thenReturn(Arrays.asList(first, second));
mockMvc.perform(get("/manageMenu"))
.andExpect(status().isOk())
.andExpect(view().name("manageMenu"))
.andExpect(forwardedUrl("/src/main/resources/tamplates/manageMenu.html"))
.andExpect(model().attribute("menus", hasSize(2)));
}
我的控制器
@GetMapping("/manageMenu")
public String chiamataGestisciMenu(Model model) {
model.addAttribute("menus", menuService.getMenus());
return "manageMenu";
}
错误
java.lang.NullPointerException: Cannot invoke "edu.AG.LandingPageSanpietro.service.MenuService.getMenus()" because "this.menuServiceMock" is null
at edu.AG.LandingPageSanpietro.controller.MenuControllerTest.testHomeController1(MenuControllerTest.java:44)
我不明白为什么when((方法不管理我的menuServiceMock.getMenus((请求以返回指定的列表。
使用mockito中的注释@Mock
而不是@Autowired
。
似乎您还没有初始化MockMvc。尝试自动布线或在@Before方法中初始化:
@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(controllers = ControllerToBeTested.class)
class MenuControllerTest {
@Autowired
private MockMvc mockMvc;
...
或者你甚至可以在@Before-lik this中初始化它:
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(new ControllerToBeTested()).build();
}