2016-11-04 1 views
1

J'ai une classe dans src/groovy comme ceComment tester la classe avec @Autowired en utilisant Spock

public class MyClass { 

@AutoWired 
SomeOtherClass someOtherClass 

String test() { 
    return someOtherClass.testMethod() 
} 
} 

Quand j'écris un test pour cette méthode que je reçois une erreur: Cannot invoke method testMethod() on null object.

Ceci est mon test: -

def "test test"() { 
    expect: 
     myClass.test() == "somevalue" 
} 

Qu'est-ce que je fais mal? Y at-il un moyen de se moquer de la classe @Autowired?

+0

avez-vous essayé la fermeture de doWithSpring? –

Répondre

1

Vous devez simuler votre someOtherClass. Quelque chose comme ça

def "test test"(){ 
    setup: 
    myClass.someOtherClass = Mock(SomeOtherClass) 
    myClass.someOtherClass.testMethod() >> "somevalue" 

    expect: 
    myClass.test() == "somevalue" 
} 
+0

cela ne fonctionne que si cette ligne est présente 'myClass.someOtherClass.testMethod() >>" somevalue "' au lieu de le faire, je veux réellement la valeur de retour de la méthode réelle au lieu de se moquer de la valeur de la méthode. – Anthony

+0

Ensuite, ce n'est pas un test unitaire. Vous devriez tester 'someOtherClass.testMethod()' dans son propre Spec, 'SomeOtherClassSpec'. Les appels dans d'autres classes doivent être Stubbed/Mocked. –

1

Bien que la réponse précédente devrait fonctionner, spock offre une façon plus élégante d'injecter des haricots selon les besoins. Vous pouvez utiliser la fermeture de doWithSpring pour déclarer les beans comme le support de spring dsl fourni dans les grails en utilisant resources.groovy.

class MyClass extends Specification{ 
def setup(){ 

    static doWithSpring={ 
     someOtherClass(SomeOtherClass) 
     //declare below if want to inject myClass somewhere else as a bean else not 
     /*myClass(MyClass){bean-> 
      someOtherClass = someOtherClass 
     }*/ 
    } 
} 

def "test test"() { 
    expect: 
     myClass.test() == "somevalue" 
} 
}