Mockito.when 方法不管理我的服务调用



我试图让单元测试成为一个简单的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();
}

最新更新