为了账号安全,请及时绑定邮箱和手机立即绑定

使用莫基托跳过行的执行

使用莫基托跳过行的执行

慕无忌1623718 2022-09-22 10:46:45
我正在使用模拟进行单元测试,我想跳过一行。// method I am testingpublic String doSomeTask(String src, String dst) {    // some code    utils.createLink(src,dst);    // some more code} // utils classpublic void createLink(String src, String dst) {    // do something    Path realSrc = "/tmp/" + src;    Files.createSymbolicLink(realSrc, dst);    // do something}// Test class@Mockprivate Utils utils;@Testpublic void testDoSomeTask() {    // this does not seem to work, it is still executing the createLink method    doNothing.when(utils).createLink(anyString(), anyString());    myClass.doSomeTask(anyString(), anyString());}现在,是一个 void 方法,它在我的测试期间失败,除了创建目录的原因。createLinkAccessDenied我想跳过该行并继续下一行。有没有办法告诉莫基托这样做?utils.createLink(src,dst);
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

假设可以使用 setter 设置该变量,则可以监视类对象并重写其方法。utilsUtilscreateLink()


基本思想是:


Utils utils = new Utils();

Utils spyUtils = Mockito.spy(utils);

doNothing().when(spyUtils).createLink(any(String.class), any(String.class));

现在,通过设置器设置此对象。每次调用时,它都不执行任何操作。spyUtilscreateLink


查看完整回答
反对 回复 2022-09-22
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

您可以模拟您的utils方法以不执行任何操作(使用PowerMockito)或更改您的代码,以便utils方法不是静态的,您可以将utils方法的模拟实例注入到您测试的对象中,如下所示:


class ForTesting{


     UtilsClass utilsInstance;


      ForTesting (UtilsClass utilsInstance) {

        this.utilsInstance = utilsInstance;

      }


     // method you test

      public String doSomeTask(String src, String dst) {

         // some code

             utilsInstance.createLink(src, dst);

          // some more code

      } 

   }


 @Test

 public void test(){

     UtilsClass utilsInstance  = mock(UtilsClass.class);

     ForTesting classForTesting = new ForTesting(utilsInstance);

     assertEquals("yourValue",classForTesting.doSomeTask());


 }

使用 PowerMockito 进行模拟会产生一些开销,因为您无法在没有继承的情况下重写静态方法,因此某些本机方法需要在运行时修改字节代码。


查看完整回答
反对 回复 2022-09-22
  • 2 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信