2016-06-29 25 views
0

Ich arbeite an einem Scala-Test, der den Code testet, der implizite Konvertierungsmethoden verwendet. Ich möchte diese impliziten Konvertierungen nicht verwenden und möchte sie im Test überspielen/überschreiben. Ist es möglich, das zu tun?Wie überschreibt man eine implizite Konvertierung in meinem Scala-Test?

Während ich methodA teste, möchte ich "asTypeB" anstelle des tatsächlich aufgerufenen Pseudo "übersteuern".

+1

Können Sie bitte Code hinzufügen, was Sie gerade tun und was genau Sie tun möchten? –

Antwort

1

Das hört sich nicht nach einer guten Idee an, aber wenn Sie eine Methode oder Funktion mit demselben Namen und Typ wie das ursprüngliche implizite im aktuellen Bereich haben, überschreibt es den vorherigen. Dieser Trick wird z. entrücken https://github.com/propensive/rapture/blob/dev/json-argonaut/shared/src/main/scala/rapture/json-argonaut/package.scala#L21https://github.com/propensive/rapture/blob/dev/json-circe/shared/src/main/scala/rapture/json-circe/package.scala#L21

+0

Ist das keine gute Idee, weil wir einen Teil des Codes auslassen, der getestet wird? – Varun

+0

Ich denke nicht, dass es in der Frage darum geht, Methode A zu kompilieren, sondern sie zu testen. –

+0

Damit das Shadowing eintritt, muss type nicht genau gleich sein, sondern muss nur für die implizite Anwendung gelten. Importe werden durch ihren Kurznamen beschattet und der zuletzt importierte gewinnt. Z.B. 'importieren A.asTypeB; Import B.asTypeB' - der zweite Import wird den ersten Schatten erzeugen. – Haspemulator

2

Wie bei jedem anderen Abhängigkeiten, machen Sie m prüfbar, indem sie es in vorbei.

def m(request: A)(implicit cv: A => B) = ??? 

Dann kann der Test entweder explizit oder implizit beliebige Umsetzungen liefern.

Aber eine implizite innerhalb der kompilierten Methode wurde zur Kompilierzeit gelöst.

Um eine benutzerdefinierte Testversion bereitzustellen, stellen Sie eine binärkompatible Version der Konvertierung bereit, die durch implizite Suche ausgewählt wurde. Aber das könnte knifflig sein und, um die andere Antwort zu zitieren, hört sich nicht nach einer guten Idee an. Wenn das Implizierte ordentlich verpackt ist, könnte es machbar sein.