在同一服务类groovy grails中调用方法时模拟方法

时间:2011-02-28 15:58:34

标签: unit-testing grails groovy mocking

我正在寻找类似于我对犀牛嘲笑的东西,但是在常规中。

我有时也使用部分嘲笑。

ASP中的

- 犀牛嘲笑

const string criteria = "somecriteriahere";
ISomeRepository mockSomeRepository = MockRepository.GenerateStrictMock<SomeRepository>();
mockSomeRepository.Expect(m => m.GetSomesByNumber(criteria)).Return(new List<Some>() { });
mockSomeRepository.Expect(m => m.GetSomesByName(criteria)).Return(new List<Some>() { });
mockSomeRepository.Expect(m => m.GetSomesByOtherName(criteria)).Return(new List<Some>() { });

mockSomeRepository.SearchForSomes(criteria);
mockSomeRepository.VerifyAllExpectations();

--------注意虚拟-------

public class SomeRepository : ISomeRepository {
    public virtual IEnumerable<Some> GetSomesByNumber(string num)
        {
        //some code here
        }

        public virtual IEnumerable<Some> GetSomesByName(string name)
        {
        //some code here
        }

        public virtual IEnumerable<Some> GetSomesByOtherName(string name)
        {
        //some code here
        }

        public IEnumerable<Some> SearchForSomes(string criteria) {
        this.GetSomesByNumber(criteria); //tested fully seperatly
        this.GetSomesByName(criteria); //tested fully seperatly
        this.GetSomesByOtherName(criteria); //tested fully seperatly

        //other code to be tested
    }
}

GetSomesByNumber,GetSomesByName,GetSomesByOtherName将完全单独测试。如果我实际上提供了值并进入了这些功能,对我来说,这似乎是在集成测试中我测试多个功能而不是一个工作单元。

所以,SearchForSomes我只会测试该方法并嘲笑所有其他依赖项。

Grails

class XService {

    def A() {
    }

    def B() {
        def result = this.A()
        //do some other magic with result
    }
}

我试过了 - 但失败了

        def XServiceControl = mockFor(XService)
        XServiceControl.demand.A(1..1) { -> return "aaa" }

        //  Initialise the service and test the target method.

        //def service = XServiceControl.createMock();

        //def service = XServiceControl.proxyInstance()

        // Act
        //def result = XServiceControl.B(_params);
        XServiceControl.use {
                new XService().B(_params)
       }

我不知道怎么做,有人知道怎么做?

由于

2 个答案:

答案 0 :(得分:0)

如果您正在使用groovy MockFor(例如groovy.mock.interceptor.MockFor),那么您需要在.use{}块中包含该用法。

但是,您似乎是在grails.test.GrailsUnitTestCase内拨打mockFor。在这种情况下,不需要.use{}块:模拟的范围是整个测试。

答案 1 :(得分:0)

感谢你的回复ataylor

似乎我想要完成的是一种叫做“强>局部/半嘲笑”的东西。这是一些链接。

http://www.gitshah.com/2010/05/how-to-partially-mock-class-and-its.html

http://mbrainspace.blogspot.com/2010/02/partial-half-mocks-why-theyre-good-real.html

https://issues.apache.org/jira/browse/GROOVY-2630

https://issues.apache.org/jira/browse/GROOVY-1823

http://java.dzone.com/articles/new-groovy-171-constructor

我没有完成这个,我最终将B()提取到它自己的类中,并将一个XService的模拟注入到B的类 - Dependency Injection中。我还被告知,删除依赖项是一种更好的测试方法。所以,我现在非常小心使用它。():D