Второе использование GrailsApplication Mock в тестах службы - PullRequest
0 голосов
/ 16 июня 2011

Я тестирую сервис Grails и использую Mocks для макетирования вызовов в класс GrailsApplication.У меня есть один тест, который проходит успешно, но когда я пробую последующие тесты, они не пройдутЯ использую требование издеваться над методом isDomainClass.Я попытался скопировать и вставить код из теста, который завершается успешно, в метод теста, который завершается с ошибкой, но при повторном запуске того же кода происходит сбой, говоря, что больше не ожидается вызовов isDomainClass.Я подозреваю некоторую утечку между методами, но я не вижу, где это.

Вещи, которые я уже пробовал:

  • Запуск тестов из командной строки (язапускаю тесты под SpringSource Tool Suite версии 2.7.0.201105292341-M2.)
  • Перенос неудачного теста в другой класс тестов (тест, который запускается первым успешно)
  • Изменение диапазона номеровв пункте требований к 1..5 (второй тест все еще не пройден)

Вот соответствующие части моего теста:

package simulation

import grails.test.*
import org.joda.time.*
import org.codehaus.groovy.grails.commons.GrailsApplication

class ObjectSerializationServiceTests extends GrailsUnitTestCase {

       def objectSerializationService

   protected void setUp() {
       super.setUp()
               objectSerializationService = new ObjectSerializationService()
   }

   protected void tearDown() {
       super.tearDown()
               objectSerializationService = null
   }

       void testDomainObjectSerialization() {
               def otherControl = mockFor(GrailsApplication)
               otherControl.demand.isDomainClass(1..1) {true}
               otherControl.demand.getDomainClass(1..1) {className ->
                       assert className == "simulation.TestDomainClass"
                       TestDomainClass.class
               }
               objectSerializationService.grailsApplication = otherControl.createMock()

               def now = new DateTime()
               def testObject = new TestDomainClass([id:57, someOtherData:"Some Other
Data", theTime:now])
               def testInstances = [testObject]
               mockDomain(TestDomainClass, testInstances)

               def serialized = objectSerializationService.serializeObject(testObject)
               def deserialized =
objectSerializationService.deserializeObject(serialized)

               assert deserialized == testObject
               assert serialized.objectType == SerializedObject.ObjectType.DOMAIN

               otherControl.verify()
       }

   void testSerializableSerialization() {
               def otherControl = mockFor(GrailsApplication)
               otherControl.demand.isDomainClass(1..1) {true}
               otherControl.demand.getDomainClass(1..1) {className ->
                       assert className == "simulation.TestDomainClass"
                       TestDomainClass.class
               }
               objectSerializationService.grailsApplication = otherControl.createMock()

               def now = new DateTime()
               def testObject = new TestDomainClass([id:57, someOtherData:"Some Other
Data", theTime:now])
               def testInstances = [testObject]
               mockDomain(TestDomainClass, testInstances)

               def serialized = objectSerializationService.serializeObject(testObject)
               def deserialized =
objectSerializationService.deserializeObject(serialized)

               assert deserialized == testObject
               assert serialized.objectType == SerializedObject.ObjectType.DOMAIN

               otherControl.verify()
   }

}

И вывод:

Testcase: testDomainObjectSerialization took 0.943 sec
Testcase: testSerializableSerialization took 0.072 sec
       FAILED
junit.framework.AssertionFailedError: No more calls to 'isDomainClass'
expected at this point. End of demands.
       at grails.test.MockClosureProxy.doBeforeCall(MockClosureProxy.java:66)
       at grails.test.AbstractClosureProxy.call(AbstractClosureProxy.java:74)
       at
simulation.ObjectSerializationService.serializeObject(ObjectSerializationService.groovy:20)
       at simulation.ObjectSerializationService$serializeObject.call(Unknown
Source)
       at
simulation.ObjectSerializationServiceTests.testSerializableSerialization(ObjectSerializationServiceTests.groovy:68)

1 Ответ

1 голос
/ 05 ноября 2011

Я получил похожую ошибку при попытке использовать mockFor для интерфейса сообщений jms в нескольких тестовых случаях.

Я справился с этим, создав пользовательский интерфейс, который расширяется от интерфейса, который необходимо смоделировать. Вы бы использовали пользовательский интерфейс для создания макета.

например.

private interface GrailsApplicationTest1 extends GrailsApplication(){}
testOne(){
    def control = mockFor(GrailsApplicationTest1)
    //...rest of code
}

private interface GrailsApplicationTest2 extends GrailsApplication(){}
testTwo(){
    def control = mockFor(GrailsApplicationTest2)
    //...rest of code
}
//add more private interfaces for additional test cases..

Я не совсем уверен, почему, но я думаю, что mockFor ведет себя по-разному между интерфейсами и неинтерфейсами. Но это только дикое предположение.

...