2016-04-04 2 views
0

Ich habe vor kurzem mit der Programmierung in Scala begonnen. Ich habe ein Projekt mit einer Hierarchie von Klassen, die sich gegenseitig anrufen. Schließlich rufen sie zuletzt ein Singleton-DAL-Objekt (Data Access Layer) auf, das eine gespeicherte Prozedur in MySQL aufruft.So verwenden Sie Mocks in Scala, um ein Singleton-Objekt zu verspotten

Ich habe ein DAL-Objekt mit der folgenden Signatur:

def callStoredProcedure(procName: String, params: Array[String]): Boolean

Ich möchte einen Test schreiben, die eine Funktion der Top-Level-Klasse aufruft, und prüft, was procName an die übergeben wurde Funktion.

Wie gehe ich vor, um ein Mock für das DAL-Objekt zu erstellen? Wie kann ich es in die Prozesspipeline injizieren, oder gibt es eine bessere/empfohlene Möglichkeit, das Singleton durch einen Schein zu ersetzen, der nur den Prozedurennamen zurückgibt, anstatt ihn aufzurufen?

Wir verwenden derzeit Mockito, aber ich bin offen für alles.

Antwort

1

Verwenden Sie keine Singletons direkt, das ist keine gute Idee. Du weißt, warum? Weil Sie sie nicht für Unit-Tests verspotten können, duh. es stattdessen ein Parameter Ihrer Klasse Marke:

trait DAL { 
    def callStoredProcedure(procName: String, params: Array[String]): Boolean  
} 

object DALImpl extends DAL { 
    def callStoredProcedure(procName: String, params: Array[String]): Boolean = doStuff 
} 

class Foo(dal: DAL = DALImpl) 

val testMe = new Foo(mock[DAL]) 

oder

class Foo { 
    def dal: DAL = DALImpl 
} 

val testMe = new Foo { 
    override def dal = mock[DAL] 
} 
0

Sie tun können:

class Foo(dal: DAL) 

val testMe = new Foo(dal = mock[DAL.type]) 

Prost

+0

Wie die Hilfe ist, wenn ich fragen darf? Ich möchte den Namen des gespeicherten Procs abrufen, ohne dass er tatsächlich aufgerufen wird. Spionage wird das nicht tun. Verspotten würde immer noch eine Injektion durch alle Schichten erfordern. Korrigiere mich, wenn ich falsch liege? –

+0

Ja, 'Mock [DAL.type]' benötigt eine Injektion, genau wie Dima es zeigte, ohne sich mit einem Merkmal herumschlagen zu müssen. 'spy (DAL)' ist eigentlich nicht relevant für Sie, da es die Funktion tatsächlich berechnet. Ich bearbeite meine Antwort. – Joan

Verwandte Themen