使用Mockito跳过一行的执行

时间:2019-04-05 19:14:37

标签: java unit-testing junit mockito

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

$image = new Imagick('captcha.png');
$image->thresholdimage(0.1 * \Imagick::getQuantum(), 134217727); 
$image->shaveImage(2, 1);
$image->writeImage("output.jpg"); 

现在,// 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()); } 是一个无效方法,在我的测试过程中失败,但由于异常原因createLink而无法创建目录。

我要跳过AccessDenied行,并继续下一行。有什么办法可以让Mockito做到这一点?

2 个答案:

答案 0 :(得分:1)

假设可以使用设置器设置utils变量,则可以监视Utils类对象并覆盖其createLink()方法。

基本思想是:

Utils utils = new Utils();
Utils spyUtils = Mockito.spy(utils);
doNothing().when(spyUtils).createLink(any(String.class), any(String.class));

现在,通过设置器设置此spyUtils对象。每次调用createLink时,它什么都不做。

答案 1 :(得分:0)

您可以模拟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进行模拟会带来一些开销,因为您不能在没有继承的情况下覆盖静态方法,因此需要一些本机方法在运行时修改字节码。