【问题标题】:Mockito.when method doesn't manage my service callMockito.when 方法不管理我的服务调用
【发布时间】:2022-01-23 01:15:32
【问题描述】:

我正在尝试使单元测试测试一个简单的 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 spring-mvc-test


    【解决方案1】:

    使用来自 mockito 的注解 @Mock 而不是 @Autowired

    【讨论】:

      【解决方案2】:

      好像你还没有初始化 MockMvc。尝试自动装配或在 @Before 方法中初始化它:

      @RunWith(SpringJUnit4ClassRunner.class)
      @WebMvcTest(controllers = ControllerToBeTested.class)
      class MenuControllerTest {
      @Autowired
      private MockMvc mockMvc;
      ...
      
      

      或者你甚至可以在@Before 中初始化它,就像这样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多