2017-05-27 1 views
0

J'essaie d'utiliser la méthode withFixture pour initialiser mon var ip2GeoTestJson et l'utiliser tout au long de mes tests. J'ai été en mesure d'atteindre la logique souhaitée avec var year. Je crois que l'erreur que j'obtiens (analyse JNothing) est causée parce que le withFixture n'initialise pas mon ip2GeoTestJson avec le JSON.Lecture et initialisation de données json avec scalatest withFixture

Je reçois actuellement cette erreur:

*** RUN ABORTED *** 
    An exception or error caused a run to abort: java.lang.ClassCastException was thrown scenario("event.client_ip_address and event_header.client_ip_address both have values") -, construction cannot continue: "org.json4s.JsonAST$JNothing$ cannot be cast to org.json4s.JsonAST$JObject" (IP2GeoTestSuite.scala:51) 

code:

class IP2GeoTestSuite extends FeatureSpec with SparkContextFixture { 
    var ip2GeoTestJson: JValue = null 
    var year: String = null  

    feature("feature") { 
    scenario("scenario") { 
     println(ip2GeoTestJson) 
     assert(year != null) 
     assert(ip2GeoTestJson != null) 
    } 
    } 

    def withFixture(test: NoArgTest): org.scalatest.Outcome = { 
    year = test.configMap("year").asInstanceOf[String] 
    val ip2GeoConfigFile = test.configMap("config").asInstanceOf[String] 
    val ip2GeoUrl = getClass.getResourceAsStream(s"/$ip2GeoConfigFile") 
    val ip2GeoJsonString = Source.fromInputStream(ip2GeoUrl).getLines.mkString("") 
    System.out.println(ip2GeoJsonString) 
    ip2GeoTestJson = parse(ip2GeoJsonString) 
    try { 
     test() 
    } 
    } 
} 

Le code fonctionne très bien quand les lignes concernant ip2GeoData sont déplacés vers le haut de la classe comme si toutefois je dois hardcode le nom de fichier:

class IP2GeoTestSuite extends FeatureSpec with SparkContextFixture { 
    val ip2GeoConfigFile = "ip2geofile.json" 
    val ip2GeoUrl = getClass.getResourceAsStream(s"/$ip2GeoConfigFile") 
    val ip2GeoJsonString = Source.fromInputStream(ip2GeoUrl).getLines.mkString("") 
    System.out.println(ip2GeoJsonString) 
    val ip2GeoTestJson = parse(ip2GeoJsonString) 
    var year: String = null  

    feature("feature") { 
    scenario("scenario") { 
     println(ip2GeoTestJson) 
     assert(year != null) 
     assert(ip2GeoTestJson != null) 
    } 
    } 

    def withFixture(test: NoArgTest): org.scalatest.Outcome = { 
    year = test.configMap("year").asInstanceOf[String] 
    try { 
     test() 
    } 
    } 
} 
+0

1) Il semble que le code a changé pour un échantillon. 2) Vous avez un problème d'initialisation ou d'analyse. Rien avec scalatest. 3) De l'échantillon il semble inutile de définir les vars. Surtout hors de la portée de la méthode. 4) Encore une fois à partir de l'échantillon, vous n'utilisez pas 'OneArgTest' – Zernike

+0

@Zernike Mon erreur, c'était censé être' NoArgTest' J'ai fait la correction. Oui, j'ai des problèmes lors de l'initialisation. Dans le second exemple, j'ai déplacé toute la logique d'analyse de fichiers JSON en dehors de la méthode et cela fonctionne mais je dois coder en dur le fichier. Je veux récupérer le nom de fichier de 'configMap' et l'initialiser mais je ne suis pas sûr de savoir comment le faire fonctionner – Liondancer

+0

Jusqu'à votre exemple, il n'est pas nécessaire de" diviser "l'initialisation des variables. Définissez 'val' soit dans le corps du trait (s'il ne doit être initialisé qu'une seule fois), soit dans le corps de la méthode (dans l'autre sens). – Zernike

Répondre

1

Définissez les paramètres avant chaque test (se e http://www.scalatest.org/user_guide/sharing_fixtures#withFixtureOneArgTest):

case class FixtureParams(year: String, ip2GeoTestJson: JValue) 

class IP2GeoTestSuite extends FeatureSpec with SparkContextFixture {  

    feature("feature") { 
    scenario("scenario") { 
     println(ip2GeoTestJson) 
     assert(year != null) 
     assert(ip2GeoTestJson != null) 
    } 
    } 

    override def withFixture(test: OneArgTest): org.scalatest.Outcome = { 
    val year = test.configMap("year").asInstanceOf[String] 
    val ip2GeoConfigFile = test.configMap("config").asInstanceOf[String] 
    val ip2GeoUrl = getClass.getResourceAsStream(s"/$ip2GeoConfigFile") 
    val ip2GeoJsonString = Source.fromInputStream(ip2GeoUrl).getLines.mkString("") 
    val fixtureParam = FixtureParam(year, parseJson(ip2GeoJsonString)) 
    try { 
    withFixture(test.toNoArgTest(fixtureParam)) 
    } finally { 
    // Close resourses to avoid memory leak and unpredictable behaviour 
     ip2GeoUrl.close() 
    } 
    } 
} 

Set params qu'une seule fois avant tout essai sera exécuté (http://www.scalatest.org/user_guide/sharing_fixtures#beforeAndAfter):

class IP2GeoTestSuite extends FeatureSpec with BeforeAndAfter { 

    var ip2GeoTestJson: JValue = null 
    var year: String = null 

    before { 
    // Load config manually because configMap isn't available here. 
    val config = ConfigFactory.load() 
    year = config.getString("year") 
    val ip2GeoConfigFile = "ip2geofile.json" 
    val ip2GeoUrl = getClass.getResourceAsStream(s"/$ip2GeoConfigFile") 
    val ip2GeoJsonString = Source.fromInputStream(ip2GeoUrl).getLines.mkString("") 
    ip2GeoUrl.close() 
    System.out.println(ip2GeoJsonString) 
    ip2GeoTestJson = parseJson(ip2GeoJsonString) 
    } 

    feature("feature") { 
    scenario("scenario") { 
     println(ip2GeoTestJson) 
     assert(year != null) 
     assert(ip2GeoTestJson != null) 
    } 
    } 
}