groovy / grails / модульное тестирование / createCriteria.get - PullRequest
10 голосов
/ 15 сентября 2010

Я могу высмеивать звонки на:

MyDomainClass.createCriteria().list{
    eq('id',id)
    eq('anotherParameter',anotherParameterId)
}

с:

def myCriteria = [
    list : {Closure  cls -> returnThisObject}
]
MyDomainClass.metaClass.static.createCriteria = { myCriteria }

, как рекомендовано по адресу:

http://davistechyinfo.blogspot.com/2010/01/mocking-hibernate-criteria-in-grails.html

, но для:

MyDomainClass.createCriteria().get{
    eq('id',id)
    eq('anotherParameter',anotherParameterId)
}

Этот подход не удался - возможно, потому что «get» - это ключевое слово, а «list» - нет.Может ли кто-нибудь посоветовать - возможность сделать это в классах предметной области должна быть возможной, просто не отказываясь от покрытия модульных тестов для методов, которые используют createCriteria().get{}.

Предложения, которые высоко ценятся,

Alex

Ответы [ 3 ]

15 голосов
/ 16 сентября 2010

Я нашел решение, которое не ставит под угрозу мою способность писать модульные тесты -

def myCriteria = new Expando();
myCriteria .get = {Closure  cls -> returnThisObject}         
MyDomainClass.metaClass.static.createCriteria = {myCriteria }

, который делает именно то, что я хотел, и потенциально поддерживает тестирование предоставленных аргументов. Спасибо за другой ответ. Надеюсь, что это полезно для других, тестирующих методы domain / createCriteria ().

5 голосов
/ 15 сентября 2010

Я бы не стал беспокоиться. Вместо этого создайте методы в своем доменном классе и смейтесь над ними. Это облегчает тестирование, но, что более важно, имеет то преимущество, что сохраняет постоянство там, где оно есть, а не разбрасывает его по всей базе кода:

class MyDomainClass {
   String foo
   int bar

   static MyDomainClass findAllByIdAndAnotherParameter(long id, long anotherParameterId) {
      createCriteria().list {
         eq('id',id)
         eq('anotherParameter',anotherParameterId)
      }
   }

   static MyDomainClass getByIdAndAnotherParameter(long id, long anotherParameterId) {
      createCriteria().get {
         eq('id',id)
         eq('anotherParameter',anotherParameterId)
      }
   }
}

Тогда в ваших тестах просто смоделируйте это как

def testInstances = [...]
MyDomainClass.metaClass.static.findAllByIdAndAnotherParameter = { long id, long id2 ->
   return testInstances
}

и

def testInstance = new MyDomainClass(...)
MyDomainClass.metaClass.static.getByIdAndAnotherParameter = { long id, long id2 ->
   return testInstance
}
1 голос
/ 28 октября 2011

Теперь все намного проще с методом GrailsUnitTestCase.mockDomain 1 .

Grails-приложение / домен / Песочница / Grails / Foo / Something.groovy

package sandbox.grails.foo

class Something {
    String name
}

тест / блок / песочнице / Grails / Foo / SomethingTests.groovy

package sandbox.grails.foo

import grails.test.mixin.*
import org.junit.*

@TestFor(Something)
class SomethingTests {

    void testSomething() {

        mockDomain(Something, [
            new Something(name: 'Foo'),
            new Something(name: 'Bar'),
            new Something(name: 'Boo'),
            new Something(name: 'Baz')
        ])

        def actuals = Something.createCriteria().list(sort: 'name', order: 'asc') {
            like('name', '%oo')
        }

        assertEquals 2, actuals.size()

    }
}
...