2012-03-13 15 views
7

Próbuję zrobić proste kpiny z klasy Domain w ramach testu jednostkowego dla usługi Grails zgodnie z dokumentacją, ale nie wydaje się działać w ogóle, w zapytaniach dla instancji zawsze return null. Czy brakuje mi czegoś prostego? Tutaj jest odpowiednia część mojego kodu, mam zmieniony klasy i metody testowania nazwy dla jasności:Połączenie MockDomain zapewniające dane domen urządzeń nie działa, czego mi brakuje? Grails 2.0.1

@TestFor(MyService) 
@TestMixin(DomainClassUnitTestMixin) 

class MyServiceTests { 


    void testMyThing() { 
     defineBeans {anotherService(AnotherService)} //My service under test uses another service, unlikely relevant? 

     MyUser.metaClass.isDirty = { //workaround for mockDomain not adding isDirty method. 
      println("dirty check called"); 
     } 

     mockDomain(MyUser, [ 
       [username: "[email protected]", accountType: UserType.STANDARD, id: 1L], 
       [username: "[email protected]", accountType: UserType.STANDARD, id:3L], 
       [username: "[email protected]", accountType: UserType.BUSINESS, id:2L] 
     ]) 

     MyUser user1 = MyUser.get(1); 
     System.out.println("user 1: ${user1}"); // output is 'user 1: null' 

     MyUser user1byName = MyUser.findByUsername("[email protected]"); 
     System.out.println("user 1 by name: ${user1byName}"); // output is 'user 1 by name: null' 

     ... the actual testing stuff which would love to have non null MyUser objects ... 
}   
} 
+0

Czy próbowałeś dodać @Mock (MyUser)? –

+0

@tomy Tak, zrobiłem, bez efektu. Biorąc pod uwagę dokumentację, nie powinno być potrzebne przy używaniu mockDomain() – Peter

Odpowiedz

11

I zorientowaliśmy się, i można by pomyśleć, myślałem o tym, jakie dane zostały wcześniej ugryziona przez to. Problem polegał na sprawdzaniu poprawności i domyślnym zachowaniu GORM w GIM, polegającym na tym, że nie udało się zachować danych zapisanych w save() (które musi użyć metoda mockDomain podczas przekazywania danych dla fałszywych instancji), jeśli klasa Domain ma błędy sprawdzania poprawności. MyUser wymaga niezapisanego hasła.

Dawno temu dodałem grails.gorm.failOnError=true do mojego Config.groovy dla mojej aplikacji, więc nie myślę już o tym, ale oczywiście, że nie można odczytać w urządzeniu do testów

Moim zdaniem to sprawia, że ​​podpis mockDomain bardzo delikatny (i nie mogłem znaleźć sposobu ustawienia failOnError = true). Zmieniłem fałszywe ustawienia danych na następujące, które mają dokładnie taki sam wynik, ale daje natychmiastową porażkę, jeśli źle skonfigurujesz dane.

@Mock(MyUser) 
class MyServiceTests { 
    ... 

    void testMyThing() { 
     new MyUser(username: "[email protected]", 
        accountType: UserType.STANDARD, 
        id: 1L).save(failOnError:true) //throws exception because MyUser requires password field to be non blank 
    ... 
    } 
} 
+1

Po prostu straciłem godzinę zastanawiającą się nad tym samym problemem, aż znalazłem to. Dzięki! – elias

+1

Użyłem wtyczki "build-test-data", i to zadziałało ... ale nowy MyUser (...) nie zrobił. Więc problem był trochę zakamuflowany. Bardzo podchwytliwa, a ta odpowiedź pomogła –

+0

Ta odpowiedź uratowała mnie, waląc głową w ścianę na następną godzinę! Dobre znalezisko, i jestem pewna, że ​​kiedyś znowu będziemy go pogryzieni. – spikeheap

Powiązane problemy