Objet compagnon partagé par Kotlin dans les tests Junit

thomas77

J'ai un test d'intégration où je démarre un MongoDB intégré en tant qu'objet compagnon. Je veux réutiliser ce morceau de code et je ne suis pas sûr que l'héritage soit la voie à suivre (si possible).

C'est une application Spring Boot:

Ceci est mon test:

@RunWith(SpringRunner::class)
@SpringBootTest
class RequestRepositoryTest {

@Autowired lateinit var requestRepository: RequestRepository

  companion object {
    private val starter = MongodStarter.getDefaultInstance()
    private var _mongod: MongodProcess? = null
    private var _mongo: MongoClient? = null

    @BeforeClass
    @JvmStatic fun beforeTest(){
        val port = 27017
        val _mongodExe = starter.prepare(MongodConfigBuilder()
                .version(Version.Main.DEVELOPMENT)
                .net(Net("localhost", port, Network.localhostIsIPv6()))
                .build())
        _mongod = _mongodExe.start()
        _mongo = MongoClient("localhost", port)
    }

    @AfterClass
    @JvmStatic fun afterTest(){
        _mongod?.stop()
    }
  }

  @Test
  fun store() {
    val id = requestRepository.store(Request(requestId = "123"))
    assertNotNull(id)
  }

}

Ma classe de référentiel:

@Repository
class RequestRepository @Autowired constructor(val datastore: Datastore) 
{
  fun store(request : Request) : String = 
  datastore.save(request).id.toString()
}

Ma question est donc de savoir quelle est la «bonne» façon de procéder à Kotlin.

Edition de mise à jour : En tant qu'objet externe, le test semble maintenant beaucoup plus propre et la ressource externe JUnit est complètement réutilisable entre les classes de test:

Merci @Lovis

@RunWith(SpringRunner::class)
@SpringBootTest
class RequestRepositoryTest {

  companion object {
      @ClassRule
      @JvmField
      val mongoServer = MongoServer
  }

  @Autowired lateinit var requestRepository: RequestRepository

  @Test
  fun store() {
    val id = requestRepository.store(Request(requestId = "123"))
    assertNotNull( id )
    assertTrue { ObjectId.isValid(id) }
  }

}

Lovis

Vous devriez pouvoir réaliser ce que vous voulez en utilisant jUnit @ClassRuleet ExternalResource. Pas de magie Kotlin nécessaire :-)

Définissez un objectdans un fichier séparé:

object MongoServer  : ExternalResource() {
    @Throws(Throwable::class)
    override fun before() {
        // before class
    }

    override fun after() {
       // after class
    }
}

Ensuite, utilisez-le dans chaque test:

companion object {
    @ClassRule
    @JvmField
    val mongoServer = MongoServer
}

L' ClassRuleannotation fait l'affaire ici, il companion objectest nécessaire de la rendre statique et l' @JvmFieldannotation est nécessaire pour rendre le champ public. Ce sont des restrictions du système de règles de jUnit.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Fonction d'objet compagnon moqueur dans Kotlin

Accéder aux variables de classe parent dans l'objet compagnon dans Kotlin

Comment puis-je appeler une méthode parent à partir d'un objet compagnon dans kotlin

Utiliser l'objet compagnon dans kotlin android est une bonne pratique?

Objet compagnon pour Set dans Scala

Assertion dans les tests Java JUnit

Comment déclarer la méthode native cpp pour laquelle déclarée dans l'objet compagnon kotlin?

Kotlin - Est-il possible d'initialiser l'objet compagnon avant le bloc init dans une classe?

Comment verrouiller un objet partagé par plusieurs méthodes asynchrones dans nodejs?

simuler une pression de touche dans les tests JUnit

Est-il possible d'avoir un contexte partagé entre les tests unitaires dans go test?

GCC: n'inclut pas les informations système dans l'objet partagé

Fermer les fichiers partagés par programme

Champ d'accès à partir du trait dans l'objet compagnon

L'initialisation de la carte dans l'objet compagnon lève ExceptionInInitializerError

Dans certains livres sur les méthodes d'instance de programmation fonctionnelle, déléguer à des fonctions binaires définies dans l'objet compagnon. Une raison pratique derrière cela?

Les tests JUnit ne réussissent que lorsque je les lance un par un. Filetage probablement incorrect

Je ne pouvais pas comprendre la logique de willThrow, doThrow dans les tests junit mockito

Les tests Junit 5 ne se lancent pas dans Eclipse en raison de NoClassDefFoundError: TestEngine

Script pour rechercher et supprimer uniquement les fichiers créés par moi dans le dossier partagé de Google Drive

Impossible de voir la valeur par défaut apparaître dans les préférences partagées

comment scala traiter l'objet compagnon?

Remplacez l'objet par des champs statiques par les valeurs des champs dans Webpack

Comment remplacer facilement les modules Hilt de production par des faux dans tous les tests

Comment valider les attributs qui commencent par @ dans les tests Postman JS

Comment générer un objet partagé nul dans Chapel?

Fichier partagé pour les bibliothèques Android Kotlin DSL

Objet du monde dans cucumber.js ou où mettre l'état dans les tests de concombre

Comment définir mon application par défaut dans les tests d'espresso?