猿问

使用莫基托跳过行的执行

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


// 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);


慕无忌1623718
浏览 190回答 2
2回答

茅侃侃

假设可以使用 setter 设置该变量,则可以监视类对象并重写其方法。utilsUtilscreateLink()基本思想是:Utils utils = new Utils();Utils spyUtils = Mockito.spy(utils);doNothing().when(spyUtils).createLink(any(String.class), any(String.class));现在,通过设置器设置此对象。每次调用时,它都不执行任何操作。spyUtilscreateLink

繁华开满天机

您可以模拟您的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 进行模拟会产生一些开销,因为您无法在没有继承的情况下重写静态方法,因此某些本机方法需要在运行时修改字节代码。
随时随地看视频慕课网APP

相关分类

Java
我要回答