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) }
}
}
Vous devriez pouvoir réaliser ce que vous voulez en utilisant jUnit @ClassRule
et ExternalResource
. Pas de magie Kotlin nécessaire :-)
Définissez un object
dans 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' ClassRule
annotation fait l'affaire ici, il companion object
est nécessaire de la rendre statique et l' @JvmField
annotation 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
Déjame decir algunas palabras