你如何在Groovy中模拟在另一个对象中实例化的对象?

时间:2011-07-13 07:41:21

标签: testing groovy

这是我的示例代码

class CommandLine {

    def ls() {
        def cmd = "ls".execute()
        if(cmd.waitFor() != 0) {
            throw new Execution()
        }
        return cmd.text
    }
}

cmd变量包含java.lang.Process类型的对象。我如何模拟waitFor()方法以测试抛出的异常?如果我不能,是否有某种方法可以重写以促进自动化测试?

一般来说,如何模拟在另一个类中实例化的对象,或者如何构造代码以允许进行测试?

2 个答案:

答案 0 :(得分:1)

我不熟悉Groovy,但是如果有可能模仿方法String#execute()来返回一个带有方法Process的模拟waitFor(),它返回的结果不是零,那么它将是这样做的方式

类似的东西:

Process mockedProcess = MockingFramework.mock(Process.class); // MockingFramework can be Mockito
MockingFramework.when(String.execute()).thenReturn(mockedProcess);
MockingFramework.when(mockedProcess.waitFor).thenReturn(1);

new CommandLine().ls(); // Boom! => Execution exception

答案 1 :(得分:0)

答案是使用Groovy模拟而不是内置的Grails模拟。

import groovy.mock.interceptor.MockFor

class TestClass {

    def test() {
        def mock = new MockFor(classToBeMocked)

        mock.demand.methodToBeMocked(1..1) { -> /* code */ }

        mock.use {
            /*
            All calls to objects of type classToBeMocked will be 
            intercepted within this block of code.
            */
        }
    }
}