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

有没有办法验证Spring Controller上的方法是使用Mockito调用的

国兴贤
2023-03-14

这是我的模拟测试:

@RunWith(MockitoJUnitRunner.class)
public class Controller_Test {

    private MockMvc mockMvc;

    @InjectMocks
    private EmployeeController employeeController;

    @Mock
    private InputValidationService inputValidationService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(restController).build();

    }

    @Test
    public void testGetEmployeeDetails() {

        EmployeeController spy = Mockito.spy(employeeController);
        MvcResult result = mockMvc.perform(get("/employee/details/9816")).andDo(print()).andExpect(status().isOk()).andReturn();

    // Have some basic asserts here on the result that are working fine


    }


    }

现在我的问题是,是否有一种方法可以断言我希望在控制器中调用的方法实际上已经被调用。

我知道,但是我怎么用单元测试来断言呢?

例如,这是我在控制器中的请求映射:

@RequestMapping(value = "/employee/details/{id}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET)
    @ResponseStatus( HttpStatus.OK)
    @ResponseBody   
    public EmployeeDetails getEmployeeDetailsById(@PathVariable String employeeID) {

    //Some business logic

    }

现在我想作一些断言,例如:

Mockito.verify(spy, times(1)).getEmployeeDetailsById();

所以,基本上我想断言,我希望被调用的方法就是被调用的那个方法。我知道这可以在我拥有的MockService对象上完成,即inputValidationService,但我也想为控制器提供类似的东西。

如果您希望我发布任何其他详细信息,请告诉我。

共有2个答案

单展
2023-03-14

您可以使用@MockBean.This将使用Mockito bean,您将能够使用标准Mockito函数,如“验证”。

http://docs . spring . io/spring-boot/docs/current/reference/html single/# boot-features-testing-spring-boot-applications-mocking-beans

松秦斩
2023-03-14

也许晚了,但我找到了org.springframework.test.web.servlet.result.HandlerResultMatchers可以验证调用了正确的控制器和方法。例如:

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.handler;

    mockMvc
        .perform(get("/employee/details/9816"))
        .andExpect(handler().handlerType(EmployeeController.class))
        .andExpect(handler().methodName("getEmployeeDetailsById"));
 类似资料:
  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 问题内容: 我正在使用Mockito用Java编写单元测试,并且我想验证某种方法是在对象 上 调用的 最后一个 方法。 我在被测试的代码中正在做这样的事情: 在我的模拟中,我不在乎编辑行中所有内容的顺序,但是非常重要的是,保存后 不要 尝试对其进行任何其他操作。有什么好方法吗? 请注意,我不是在寻找verifyNoMoreInteractions:它不会确认saveToDatabase是最后调用的

  • 我试图按照API密钥身份验证代码从这个答案:https://stackoverflow.com/a/48448901 我创建了我的过滤器类: 然后我实现了我的安全配置: 当我用头作为请求的一部分对应用程序进行外部调用时,我得到一个403禁止响应。我可以看到过滤器从头中拉出键。这部分正在工作。 但是,不会调用authenticate()方法来检查头是否有效。我不确定我错过了什么,代码在我看来是一样的

  • 我在类中有一个签名为的方法。 我有一个调用方法的代码块: 如果我想测试databaseService.save(user)没有被调用,那么我如何用Mockito(3.3.3版)来做呢?

  • 此代码在控制台中有以下输出: Method1 Method2 Method3 而我希望它是 Method1 Method2 Mock method3 方法3被嘲弄了,那么为什么它没有被调用呢?

  • 问题内容: 我想测试一些在同一类中调用其他方法的方法。它们基本上是相同的方法,但是具有不同数量的参数,因为数据库中有一些默认值。我在这个上展示 因此,我想测试在调用方法getPrice(int)时是否调用了方法getPriceForOne()。基本上像平常一样调用getPrice(int)并模拟getPriceForOne。 请记住,我有一个更为复杂的文件,该文件可供其他人使用,它们必须全部放在一