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

使用莫基托跳过行的执行

使用莫基托跳过行的执行

慕无忌1623718 2022-09-22 10:46:45

我正在使用模拟进行单元测试,我想跳过一行。


// method I am testing

public String doSomeTask(String src, String dst) {

    // some code


    utils.createLink(src,dst);


    // some more code



// utils class

public void createLink(String src, String dst) {

    // do something

    Path realSrc = "/tmp/" + src;

    Files.createSymbolicLink(realSrc, dst);


    // do something

}



// Test class


@Mock

private Utils utils;


@Test

public 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贡献1507条经验 获得超21个赞

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


基本思想是:


Utils utils = new Utils();

Utils spyUtils = Mockito.spy(utils);

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

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


查看完整回答
反对 回复 5天前
?
繁华开满天机

TA贡献1484条经验 获得超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 进行模拟会产生一些开销,因为您无法在没有继承的情况下重写静态方法,因此某些本机方法需要在运行时修改字节代码。


查看完整回答
反对 回复 5天前

添加回答

举报

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