2012-04-23 20 views
7

Mam klasy domeny, która rozszerza klasy abstrakcyjna, który wstrzykuje usługi spring security core plugin.Jak wyśmiać usługę wstrzykniętą w klasie domeny z klasy kontrolnej kontrolera?

class Extra extends WithOwner { 
    String name 
} 

abstract class WithOwner { 
    transient springSecurityService 
    User user 

    def getCurrentUser() { 
     return springSecurityService.currentUser 
    } 

    def beforeValidate() { 
     if(!user) { 
      user = getCurrentUser() 
     } 
    } 

    Boolean isLoggedUserTheOwner(){ 
     return (user?.id == getCurrentUser()?.id) 
    } 
} 

Chcę zaimplementować test kontrolera.

@TestFor(ExtraController) 
@Mock([Extra, User, UserRole, Role]) 
class ExtraControllerTests { 

    void testEdit() { 
     def utils = new TestUtils() 
     def user1 = utils.saveUser1() 

     populateValidParams(params) 
     def extra = new Extra(params) 
     extra.user = user1 
     assert extra.save() != null 

     params.id = extra.id 


     def model = controller.edit() // Line 69 
     assert model.extraInstance == extra 
    } 
} 

Jeśli uruchomić powyższą próbę uzyskać:

test-app ExtraController.testEdit --unit --echoOut | Uruchamianie 1 testu jednostkowego ... 1 z 1 - Wyjście z testEdit - | Błąd: testEdit (com.softamo.movilrural.ExtraControllerTests) | wyjątek java.lang.NullPointerException: nie można uzyskać właściwości 'currentUser' na obiekcie zerowym na com.softamo.movilrural.WithOwner.getCurrentUser (WithOwner.groovy: 8) na com.softamo.movilrural.WithOwner.isLoggedUserTheOwner (WithOwner.groovy: 18) na com.softamo.movilrural.ExtraController.edit (ExtraController.groovy: 39) na com.softamo.movilrural.ExtraControllerTests.testEdit (ExtraControllerTests.groovy: 69) | Zakończono test 1 jednostka, 1 nie powiodło się w 853ms

Próbowałem bezskutecznie drwić służby bezpieczeństwa takiego:

Extra.metaClass.springSecurityService = new MockSpringSecurityService(user1) 

lub nawet szyderczy sposób

Extra.metaClass.getCurrentUser = { return user1 } 

Jakiś pomysł jak mogę obejść ten problem.

+0

Witam! Utknąłem z tym samym problemem. Czy opracowałeś rozwiązanie dla swojego pytania? A może masz boczną stronę do wstrzyknięcia usługi wewnątrz obiektu domeny bez automatycznego testowania jednostki? – snowindy

+0

Powodzenia w tym problemie?, Z tym samym problemem. –

Odpowiedz

1

To powinno działać:

controller.springSecurityService = new SpringSecurityService() 

Jeśli chcesz mock metodę getCurrentUser w tej usługi:

controller.springSecurityService.metaClass.getCurrentUser = { -> return user1 } 

Nie jestem pewien, czy można ommit -> w linii powyżej, więc testy to. Jeśli chcesz usunąć ten sposób szydzili po użyciu lub przed innym przypadku testowego użyj:

controller.springSecutiryService.metaClass = null 
+1

To wyjaśnia, jak wprowadzić usługę do kontrolera, jego pytanie brzmi: jak wyśmiać usługę w obiekcie domeny. –

+0

Dla samego zapisu możesz pominąć '->' i uprościć go do 'getCurrentUser = {user1}' –

2

Grails 2.x obsługuje definiowanie fasoli Wiosny w środowiskach testowych wykorzystujących zamknięcie "defineBeans. Obsługuje wtrysk zależności w kontrolerach itp., Nie jestem pewien, czy to działa również dla obiektów domeny. Teoretycznie powinien być spójny między obiektami domeny/kontrolerami/usługami

Zobacz http://grails.org/doc/latest/guide/single.html#testing - Sekcja "Testowanie wiosennych nasion".

+0

Próbowałem tego, ale nie działa. Nie mam pojęcia, jak skonfigurować dla klas domeny.defineBeans { springSecurityService (nowa usługa MockSpringSecurityService (użytkownik1)) } –

+0

Nie musisz wykonywać nowej usługi MockSpringSecurityService() podczas definiowania komponentu Spring Spring, just springSecurityService (MockSpringSecurityService) –

Powiązane problemy