2017-01-23 3 views
0

Im Versuch, spöttisch, um herauszufinden, und aus irgendeinem Grunde hält es die richtige Antwort Rückkehr (win) nicht die, die ich will es zurück (mac)Mocking ein Verfahren basierend auf dem Parameter in Spock

/** 
* This is an empty imple class. Its intention is to allow operating 
* system specific information to be mocked for unit testing. 
*/ 
class OsImpl extends Os { 

} 


/** 
* A utility convenience class that helps with pulling a variety of machine information for the build system 
*/ 
class ProjectInfo { 
    static String operatingSystem(){ 
     operatingSystem(new OsImpl()) 
    } 
    /** 
    * Returns a 3 char code on the operating system of the local machine. 
    * @return String Code ['win', 'mac', 'nix'] 
    */ 
    static String operatingSystem(OsImpl os){ 
     if (os.isFamily(os.FAMILY_WINDOWS)) { 
      'win' 
     } else if (os.isFamily(os.FAMILY_MAC)) { 
      'mac' 
     } else if (os.isFamily(os.FAMILY_UNIX)) { 
      'nix' 
     } else { 
      null 
     } 
    } 
} 

class ProjectInfoTest extends Specification { 

    def "trying this out"(){ 
     when: 
     OsImpl os = Mock(OsImpl) 

     and: 'mock a mac' 
     1 * os.isFamily(os.FAMILY_WINDOWS) >> false 
     1 * os.isFamily(os.FAMILY_MAC) >> true 

     then: 'should return a mac os' 
     ProjectInfo.operatingSystem(os) == 'mac' 
    } 
} 

In easymock ich würde normalerweise eine when(...).return(...) tun, aber ich bin nicht sicher, wie man das Gleiche mit Spock macht.

Zweitens versuchen

def "trying this out"(){ 
     setup: 
     OsImpl os = Mock(OsImpl) 
     1 * os.isFamily(os.FAMILY_WINDOWS) >> false 
     1 * os.isFamily(os.FAMILY_MAC) >> true 

     when: 
     String shouldBe = 'mac' 

     then: 'should return a mac os' 
     ProjectInfo.operatingSystem(os) == shouldBe 
    } 

Noch Fenster zurückkehrt, nicht mac

Heres ein weiteres Beispiel dafür. Ich nehme an, ich bin einfach beschissen. Aber hier ist die Methode i

def switchArtifactoryOffline(){ 
    def config = new XmlSlurper().parseText(artifactoryClient.system().configuration()) 
    if (config.offlineMode == false){ 
     config.offlineMode = true 
     artifactoryClient.system().configuration(XmlUtil.serialize(config)) 
    } 
    log.lifecycle("Disabled Artifactory Internet Access") 
} 

und meine Testmethode

def "check that it switches artifactory offline"(){ 
    when: 
    Artifactory arti = Mock(Artifactory) 
    arti.system().configuration() >> "<client><offlineMode>false</offlineMode></client>" 
    ArtifactoryWorker worker = new ArtifactoryWorker(arti) 

    then: 
    worker.switchArtifactoryOffline() 
} 

Ich erhalte eine Null auf dem System() Objekt testen möge. Jetzt, zusätzlich zu Mock-out, wie erhalte ich den Wert, den die Methode in artifactoryClient.system().configuration(XmlUtil.serialize(config)) legte, damit ich sicherstellen kann, dass es tatsächlich den Wert änderte und das XML korrekt kompilierte? Das alles scheint mir ziemlich trivial zu sein, ich kann nicht verstehen, warum ich so ein Problem damit habe. Vielleicht muss ich zurück zu Mockito wechseln.

Ok, nach mehr um einige Unordnung, kam ich mit dieser, und es scheint, wird nun auf die Statik wieder an die Arbeit .....

def "check that it switches artifactory offline"(){ 
    given: 
    Artifactory arti = Mock(Artifactory) 
    ArtifactorySystem arti_system = Mock(ArtifactorySystem) 

    arti_system.configuration() >> "<client><offlineMode>false</offlineMode></client>" 
    arti.system() >> arti_system 

    ArtifactoryWorker worker = new ArtifactoryWorker(arti) 

    when: 
    worker.switchArtifactoryOffline() 

    then: 
    1 * arti_system.configuration(_ as String) >> { 
     def config = new XmlSlurper().parseText(it) 
     assert config.offlineMode == true 
    } 
} 

Antwort

0

die spöttischen Aussagen Nach unten in die „dann :" Block. Behalte sie einfach über der Behauptung. Das "und:" ist es, was dich stolpert. Mock-Callouts gehören in den "setup/given" -Block oder den "then" -Block.

Wie so:

def "trying this out"(){ 
    setup: 
    OsImpl os = Mock(OsImpl) 

    expect: 'should return a mac os' 
    1 * os.isFamily(os.FAMILY_WINDOWS) >> false 
    1 * os.isFamily(os.FAMILY_MAC) >> true 

    ProjectInfo.operatingSystem(os) == 'mac' 
} 
+0

habe ich versucht, dass und es hat nicht funktioniert. Wenn ich den Code ausführe, wird der Fehler angezeigt, dass os keine Eigenschaft der Klasse ist. Ich habe es auf den Code, den ich gerade oben und den gleichen Deal, Returns anstelle von mac – scphantm

+0

@Scphantm, geschrieben, gibt es mehrere Probleme in Ihrem Test - Sie wollen statische Methoden testen und ist dieser Code in Java oder in groovy geschrieben? – Opal

+0

OsImpl ist groovig. Das Objekt, das OsImpl erweitert, ist java, import org.apache.tools.ant.taskdefs.condition.Os – scphantm

Verwandte Themen