2009-07-11 2 views
1

Unit testing Abstract classes in GroovymockForConstraintsTests абстрактного заводного класс

я задал вопрос о предыдущем модульном тестировании и насмешливом класс домена, но я не думаю, что я был достаточно специфичен. У меня есть класс домена:

package toplevel.domain 

abstract class Party { 
    static hasMany = [roles:PartyRole] 
    static constraints = { 
     roles(nullable:true) 
     dateCreated(display:false) 
     lastUpdated(display:false) 
    } 
    List roles 
    Date dateCreated 
    Date lastUpdated 
} 

Вот мой блок тест:

import grails.test.* 
import toplevel.domain.* 

class PartyTests extends GrailsUnitTestCase { 
    Party party 
    protected void setUp() { 
     super.setUp() 
     party = [:] as Party 
     mockForConstraintsTests(Party, [party]) 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testNullRolesIsValid() { 
     party.roles = null 
     assertTrue "The roles should be nullable", party.validate() 
    } 
} 

Вот результаты теста: Не удалось создать новый экземпляр класса [toplevel.domain.Party]!

org.codehaus.groovy.grails.exceptions.NewInstanceCreationException: Не удалось создать новый экземпляр класса [toplevel.domain.Party]! в grails.test.MockUtils.prepareForConstraintsTests (MockUtils.groovy: 540) в grails.test.MockUtils $ prepareForConstraintsTests.call (Неизвестный источник) в grails.test.GrailsUnitTestCase.mockForConstraintsTests (GrailsUnitTestCase.groovy: 111) в PartyTests.setUp (PartyTests.groovy: 9) на _GrailsTest_groovy $ _run_closure4.doCall (_GrailsTest_groovy: 203) в _GrailsTest_groovy $ _run_closure4.call (_GrailsTest_groovy) в _GrailsTest_groovy $ _run_closure2.doCall (_GrailsTest_groovy: 147) в _GrailsTest_groovy $ _run_closure1_closure19.doCall (_GrailsTest_groovy : 113) в _GrailsTest_groovy $ _run_closure1.doCall (_GrailsTest_groovy: 96) в TestApp $ _run_closure1.doCall (TestApp.groovy: 66) при gant.Gant $ _dispatch_closure4.doCall (Gant.gr oovy: 324) в gant.Gant $ _dispatch_closure6.doCall (Gant.groovy: 334) в gant.Gant $ _dispatch_closure6.doCall (Gant.groovy) в gant.Gant.withBuildListeners (Gant.groovy: 344) в gant.Gant.this $ 2 $ withBuildListeners (Gant.groovy) в gant.Gant $ this $ 2 $ withBuildListeners.callCurrent (Неизвестный источник) в gant.Gist.dispatch (Gant.groovy: 334) в gant.Gant.this $ 2 $ (Gant.groovy) на gant.Gant.invokeMethod (Gant.groovy) на gant.Gant.processTargets (Gant.groovy: 495) на gant.Gant.processTargets (Gant.groovy: 480) Вызвано : java.lang.InstantiationException

Не понимаю. Я создал экземпляр класса и передал его методу mockForConstraintsTests. Что я делаю не так?

ответ

2

Это на самом деле проблема с тем, как материал mockForConstraintsTests работает в Граалей, а не вопрос с использованием этого типа издеваться, как правило, в заводной.

Этот тип mock просто несовместим с mocks, создаваемыми mockForConstraintsTests. Если вы хотите использовать эту библиотеку, Джон прав, просто создавая и передавая простой конкретный объект класса.

Я на самом деле не большой поклонник замешательства, связанного с ограничениями в последних версиях грааля, поскольку он не «реален», и многие из насмешанных материалов отличаются от фактического кода, который запускается, когда подключение к реальной базе данных.Я предпочитаю использовать интеграционные тесты для проверки такого ограничения.

Если вы кладете тот же класс тест в тестах интеграции и удалите mockForConstraintsTests вызов, ваш код будет работать:

package toplevel.domain 

import grails.test.* 

class PartyTests extends GrailsUnitTestCase { 
    Party party 
    protected void setUp() { 
     super.setUp() 
     party = [:] as Party 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testNullRolesIsValid() { 
     party.roles = null 
     assertTrue "The roles should be nullable", party.validate() 
    } 
} 

результаты:

Running 1 integration test... 
Running test PartyTests...PASSED 
Tests Completed in 226ms ... 
------------------------------------------------------- 
Tests passed: 1 
Tests failed: 0 
------------------------------------------------------- 
3

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

package toplevel.domain 

import grails.test.* 
import toplevel.domain.* 

// Create a stub implementation class 
class PartyImpl extends Party { } 

class PartyTests extends GrailsUnitTestCase { 
    Party party 
    protected void setUp() { 
     super.setUp() 
     //party = [:] as Party 
     // Create an instance of the stub'd class 
     party = new PartyImpl() 
     //mockForConstraintsTests(Party, [party]) 
     // Need to pass in the concrete class as first arg 
     mockForConstraintsTests(PartyImpl, [party]) 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testNullRolesIsValid() { 
     party.roles = null 
     assertTrue "The roles should be nullable", party.validate() 
    } 
} 
Смежные вопросы