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

Mockito验证Spring引导测试中的调用次数

艾骏喆
2023-03-14

我试图验证一个模拟的方法fileSenderService.sendFile)被调用了2次。不管出于什么原因,Mockito从来没有失败过测试,不管期望调用的次数是多少。我是这样使用它的:

verify(mockService,times(expectedNumberOfInvocations))。sendFile(any(String.class)、any(byte[].class))

无论我在times()方法中使用什么值,测试都会通过。

MyService看起来像这样:

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    private FileSenderService fileSenderService;

    public void createAndSendFiles(){
        //doSomeStuff, prepare fileNames and fileContents(byte arrays)
        //execute the sendFile twice
        fileSenderService.sendFile(aFileName, aByteArray); //void method; mocked for testing
        fileSenderService.sendFile(bFileName, bByteArray); //void method; mocked for testing
    }

考试班

@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = {Application.class, FileSenderServiceMock.class})
@ContextConfiguration
public class MyServiceTest{

    @Autowired
    private MyService myService;

    @Autowired
    FileSenderService mock;

    @Test
    public void shouldCreateAndSendFiles(){
        myService.createAndSendFiles(); //inside this method sendFile() is called twice
        verify(mock, times(999)).sendFile(any(String.class), any(byte[].class)); //THE PROBLEM - why times(999) does not fail the test?
    }
}

FileSenderService及其模拟:

@Service
public class FileSenderServiceImpl implements FileSenderService {
   @Override
    public void sendFile(String name, byte [] content) {
      //send the file
    }
}

//used for testing instead of the actual FileSenderServiceImpl 
public class FileSenderServiceMock {
    @Bean
    @Primary
    public FileSenderService getFileSenderServiceMock(){
        FileSenderServicemock = Mockito.mock(FileSenderService.class, Mockito.RETURNS_DEEP_STUBS);

        doNothing().when(mock).sendFile(isA(String.class), isA(byte[].class));
        return mock;
    }

共有1个答案

翟鹏
2023-03-14

如果您使用@SpringBootTest作为集成测试用例,您不需要为mock定义任何测试配置类,您可以简单地使用@MockBean注释将mock注入测试上下文

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest{

    @Autowired
    private MyService myService;

    @MockBean
    FileSenderService fileSenderService;

    @Test
    public void shouldCreateAndSendFiles(){
    myService.createAndSendFiles(); 
    verify(fileSenderService, times(2)).sendFile(any(String.class), any(byte[].class));
   }
}
 类似资料:
  • 我正在尝试测试,只有在调用case的情况下,否则不会调用该方法。 但这会调用我的,并在内抛出空指针。因为我的行为不会调用,所以我如何在不调用的情况下测试它。

  • 我在SUT中有这段代码: 我知道模型不会为空,因为模型已经存在。因此,我希望不应该与model一起调用。因此,我需要某种的方法,以确保该方法不是用此参数调用的。现在我知道了如何进行相反的操作:如何确保/验证或任何方法本身是在的帮助下用参数调用的,但不确定当前的场景。请帮帮忙。 谢谢

  • 玩弄Mockito来实现我的服务的单元测试,但由于某种原因,我无法通过我的厚脑袋来实现这一点。我的考试通过了,但我不能确信我做得对。 下面是一个测试count()方法的示例。该方法只是将调用转发到它的存储库,我不想验证仅此而已,没有其他事情发生。这就是我得到的: 我的考试及格了,但我有一些问题。 > 我需要验证吗?我觉得我这样做是因为我想验证personRepository。实际上调用了count

  • 问题内容: 我正在使用Mockito编写我的测试用例。我有一个简单的类,其中包含我要测试的功能: 在单元测试中,我要测试功能: 在我的测试案例中,如何使用Mockito进行检查/验证? 问题答案: 您将不得不使用间谍。这里的问题是您要验证是否在 真实 对象而非模拟对象上调用了方法。您不能在此处使用模拟,因为它将对类中的所有方法进行存根,因此缺省情况下也对存根不执行任何操作。 但是,请注意,使用间谍

  • 我正在尝试使用开源用户管理服务,比如KeyClope。构建一个angularJs应用程序,该应用程序将向由KeyClope保护的RESTendpoint发送HTTP请求。我在后端使用spring boot。我能够调用endpoint并得到结果,这应该是不可能的,因为它会阻止来自未经授权来源的请求。 这是我遵循的两个链接 带角和Spring靴的钥匙斗篷 2.Github链接到KeyClope示例 由

  • 我有一个配置了Spring安全性的Spring启动应用程序。我已将登录请求重定向到我在 python 服务器上运行前端的 。现在,当我尝试将登录名发布到我的 springboot 应用程序时,它不起作用。即使我从邮递员那里尝试,它也说 错误。我怎样才能让它工作。如果我将其作为 html 放在同一个项目中,而不是从 python 服务器或邮递员中,它就可以从 /login 工作。有什么区别。 “消息