издеваться над методом при вызове метода в том же классе обслуживания Groovy Grails - PullRequest
0 голосов
/ 28 февраля 2011

я ищу что-то похожее на то, что я делал бы с насмешками на носорога, но в отличном состоянии.

Иногда я также использую частичные насмешки.

в 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 я бы только тестировал этот метод и устранял все другие зависимости.

В Граалях

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 голосов
/ 03 марта 2011

спасибо за ваш ответ 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

0 голосов
/ 28 февраля 2011

Если вы используете groovy MockFor (например, groovy.mock.interceptor.MockFor ), то вам нужно заключить использование в блок .use{}.

Однако этопохоже, что вы звоните mockFor из grails.test.GrailsUnitTestCase .В этом случае нет необходимости в блоке .use{}: область применения макета - весь тест.

...