当前位置: 首页 > 知识库问答 >
问题:

无法使用mockito模拟webservice客户端

鄢松
2023-03-14

我正在测试一个Springmvc控制器,它得到一个网络服务客户端自动配带,它被嘲笑了。但是嘲笑并没有奏效。在测试返回中调用“验证(stuClient,乘以(1))”。获取所有学生(sAndP命令);

Wanted but not invoked:

stuClient.getAllStudents(
    com.xyz.crudserviceclient.utilitybeans.SortablePagedCommand@3028e50e
);
-> at com.xyz.controllers.StudentControllerTest.testGetHomePage(StudentControllerTest.java:101)
Actually, there were zero interactions with this mock.

    at com.xyz.controllers.StudentControllerTest.testGetHomePage(StudentControllerTest.java:101).....

下面是我测试中的控制器方法:

@RequestMapping(value = "/getHomePage.do", method = RequestMethod.GET)
  public ModelAndView getHomePage(@RequestParam(value = "first", required = false) Integer first,
      @RequestParam(value = "max", required = false) Integer max, @RequestParam(value = "sortBy",
      required = false) String sortBy,
      @RequestParam(value = "sortDirection", required = false) String sortDir) {

    ModelAndView mav = new ModelAndView("home");

    SortablePagedCommand sortablePagedCommand = new SortablePagedCommand();
    sortablePagedCommand.setFirst(first);
    sortablePagedCommand.setMax(max);
    sortablePagedCommand.setSort(sortBy);
    sortablePagedCommand.setSortDir(sortDir);

    PagedResult<StudentBean> students = studentServiceClient.getAllStudents(sortablePagedCommand);
    List<StudentBean> studentList = students.getItems();

    int noOfRecords = students.getUnfilteredItems();
    int noOfPages = (int) Math.ceil(noOfRecords * 1.0 / max);

    mav.addObject("sortByField", sortBy);
    mav.addObject("sortDirField", sortDir);
    mav.addObject("studentList", studentList);
    mav.addObject("noOfPages", noOfPages);
    mav.addObject("currentPage", first);

    return mav;
  }

下面是我的测试类:

package com.xyz.controllers;

import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

import java.sql.Date;
import java.util.Arrays;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.xyz.crudserviceclient.beans.StudentBean;
import com.xyz.crudserviceclient.client.StudentServiceClient;
import com.xyz.crudserviceclient.utilitybeans.PagedResult;
import com.xyz.crudserviceclient.utilitybeans.SortablePagedCommand;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:WebContent/WEB-INF/dispatcher-servlet.xml" })
@WebAppConfiguration
public class StudentControllerTest {
    private MockMvc mockMvc;
    @InjectMocks
    private StudentController controller;
    @Mock
    private StudentServiceClient stuClient;
    @Autowired
    private WebApplicationContext webAppContext;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
        Mockito.reset(stuClient);
    }

    @SuppressWarnings("unchecked")
    @Test
    public void testGetHomePage() throws Exception {
        StudentBean sb1 = new StudentBean();
        sb1.setFirstName("Sai");
        sb1.setLastName("Palaparthi");
        sb1.setGender("Male");
        sb1.setDOB(new Date(System.currentTimeMillis()));
        sb1.setEmail("v.p@gmail.com");
        sb1.setMobileNumber("8121157247");
        sb1.setAddress("Huda");
        sb1.setCourses(Arrays.asList("Math", "Chem"));

        StudentBean sb2 = new StudentBean();
        sb2.setFirstName("Viswanath");
        sb2.setLastName("Palaparthi");
        sb2.setGender("Male");
        sb2.setDOB(new Date(System.currentTimeMillis()));
        sb2.setEmail("v.p@gmail.com");
        sb2.setMobileNumber("8121157248");
        sb2.setAddress("Huda");
        sb2.setCourses(Arrays.asList("Math"));

        PagedResult<StudentBean> pResult = new PagedResult<StudentBean>(
                Arrays.asList(sb1, sb2), 2);
        pResult.setFirst(0);
        pResult.setUnfilteredItems(2);

        Integer first = 0;
        Integer max = 5;
        String sortBy = "firstname";
        String sortDir = "asc";

        SortablePagedCommand sAndPCommand = new SortablePagedCommand();
        sAndPCommand.setFirst(first);
        sAndPCommand.setMax(max);
        sAndPCommand.setSort(sortBy);
        sAndPCommand.setSortDir(sortDir);
        Mockito.when(stuClient.getAllStudents(sAndPCommand))
                .thenReturn(pResult);

        mockMvc.perform(
                get("/getHomePage.do").param("first", String.valueOf(first))
                        .param("max", String.valueOf(max))
                        .param("sortBy", sortBy)
                        .param("sortDirection", sortDir))
                .andExpect(status().isOk())
                .andExpect(view().name("home"))
                .andExpect(forwardedUrl("/jsps/home.jsp"))
                .andExpect(model().attribute("sortByField", is(sortBy)))
                .andExpect(model().attribute("sortDirField", is(sortDir)))
                .andExpect(model().attribute("noOfPages", 1))
                .andExpect(model().attribute("currentPage", is(first)))
                .andExpect(model().attribute("studentList", hasSize(2)))
                .andExpect(
                        model().attribute(
                                "studentList",
                                hasItem(allOf(
                                        hasProperty("firstName", is("Sai")),
                                        hasProperty("lastName",
                                                is("Palaparthi")),
                                        hasProperty("gender", is("Male")),
                                        hasProperty(
                                                "dob",
                                                is(new Date(System
                                                        .currentTimeMillis()))),
                                        hasProperty("email",
                                                is("v.p@gmail.com")),
                                        hasProperty("mobileNumber",
                                                is("8121157247")),
                                        hasProperty("address", is("Huda")),
                                        hasProperty("courses",
                                                hasItems("Math", "Chem"))))))
                .andExpect(
                        model().attribute(
                                "studentList",
                                hasItem(allOf(
                                        hasProperty("firstName",
                                                is("Viswanath")),
                                        hasProperty("lastName",
                                                is("Palaparthi")),
                                        hasProperty("gender", is("Male")),
                                        hasProperty(
                                                "dob",
                                                is(new Date(System
                                                        .currentTimeMillis()))),
                                        hasProperty("email",
                                                is("v.p@gmail.com")),
                                        hasProperty("mobileNumber",
                                                is("8121157248")),
                                        hasProperty("address", is("Huda")),
                                        hasProperty("courses", hasItems("Math"))))));

        verify(stuClient, times(1)).getAllStudents(sAndPCommand);
        verifyNoMoreInteractions(stuClient);

    }
}

共有1个答案

龚远
2023-03-14

你完全做错了——这显然是一个集成测试,那么为什么要涉及Mockito呢;此外,您正在将模拟注入控制器字段,但您的测试没有调用控制器字段——它们正在从Spring上下文与控制器bean交互。

看看这个优秀的教程,尤其是单元测试部分。

总而言之,您的测试设置需要更改,您不需要任何注释,还必须为控制器使用独立的MockMvc设置:

public class StudentControllerTest {
    private MockMvc mockMvc;

    @InjectMocks
    private StudentController controller;

    @Mock
    private StudentServiceClient stuClient;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
        Mockito.reset(stuClient);
    }
 类似资料:
  • 我试图使用PowerMockito在我正在测试的代码中模拟java.net.URL类的创建。基本上,我希望防止真正的HTTP请求发生,而是1)在请求发出时检查数据,2)在模拟响应中提供我自己的测试数据。这就是我正在尝试的: 我要测试的代码如下所示: 在前面的测试场景中,我模拟了wlInvokeUrlString以匹配“MyURLString”。我还尝试使用whenNew行的各种其他形式,尝试注入模

  • 使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?

  • 我无法使用mockito2模拟一个Kotlin final类。另外我还在用Robolectric。 这是我的测试代码: 请注意,我使用的是Mockito Version2,我使用的是依赖项,它自动启用模拟最终类的功能。

  • 我想在类AppleProcessor中测试一个方法: 请注意,Fruit是AppleFruit实现的方法的接口,并且还有一个方法。 我的测试看起来像: 然而,我得到了以下错误:

  • 我是莫基托的新手。我试图通过模拟数据库交互为服务编写jnuit: 我有下面的类(只是实际类的代表) 我的测试课就像是 但是当我运行这个测试时,它仍然调用实际的db调用并从DB中检索值,而不是模拟值,我应该模拟sql连接和非默认构造函数吗?我一无所知。 -- 更新 正如人们所建议的那样,我将DAO实例化移动到我的服务构造函数中,并且还使用了Spy,但是我仍然调用了实际的DB调用而不是模拟调用。

  • 我的测试存根是 我在这里做错了什么?