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