Birim testi sınıfınız, bir grup test yöntemi için paylaşılan bir kaynağı yönetmek için genellikle birkaç şeye ihtiyaç duyar. Ve KOTLIN içinde kullanabileceğiniz @BeforeClass
ve @AfterClass
olmayan deney sınıfında değil, onun içindeki arkadaşı nesne ile birlikte @JvmStatic
açıklama .
Bir test sınıfının yapısı şöyle görünür:
class MyTestClass {
companion object {
init {
}
val someClassVar = initializer()
lateinit var someClassLateVar: SomeResource
@BeforeClass @JvmStatic fun setup() {
}
@AfterClass @JvmStatic fun teardown() {
}
}
val someInstanceVar = initializer()
var lateinit someInstanceLateZVar: MyType
@Before fun prepareTest() {
}
@After fun cleanupTest() {
}
@Test fun testSomething() {
}
@Test fun testSomethingElse() {
}
}
Yukarıdakiler göz önüne alındığında, aşağıdakileri okumalısınız:
- tamamlayıcı nesneler - Java'daki Class nesnesine benzer, ancak statik olmayan sınıf başına tek bir
@JvmStatic
- Java birlikte çalışması için dış sınıfta bir tamamlayıcı nesne yöntemini statik bir yönteme dönüştüren bir açıklama
lateinit
- var
iyi tanımlanmış bir yaşam döngüsüne sahip olduğunuzda bir mülkün daha sonra başlatılmasına izin verir
Delegates.notNull()
- lateinit
okunmadan önce en az bir kez ayarlanması gereken bir özellik yerine kullanılabilir .
Burada, Kotlin için gömülü kaynakları yöneten daha kapsamlı test sınıfları örnekleri verilmiştir.
İlki Solr-Undertow testlerinden kopyalanır ve değiştirilir ve test senaryoları çalıştırılmadan önce bir Solr-Undertow sunucusunu yapılandırır ve başlatır. Testler çalıştıktan sonra, testler tarafından oluşturulan tüm geçici dosyaları temizler. Ayrıca, testler çalıştırılmadan önce ortam değişkenlerinin ve sistem özelliklerinin doğru olmasını sağlar. Test senaryoları arasında, geçici olarak yüklenmiş Solr çekirdeklerini kaldırır. Test:
class TestServerWithPlugin {
companion object {
val workingDir = Paths.get("test-data/solr-standalone").toAbsolutePath()
val coreWithPluginDir = workingDir.resolve("plugin-test/collection1")
lateinit var server: Server
@BeforeClass @JvmStatic fun setup() {
assertTrue(coreWithPluginDir.exists(), "test core w/plugin does not exist $coreWithPluginDir")
resetEnvProxy()
cleanSysProps()
routeJbossLoggingToSlf4j()
cleanFiles()
val config = mapOf(...)
val configLoader = ServerConfigFromOverridesAndReference(workingDir, config) verifiedBy { loader ->
...
}
assertNotNull(System.getProperty("solr.solr.home"))
server = Server(configLoader)
val (serverStarted, message) = server.run()
if (!serverStarted) {
fail("Server not started: '$message'")
}
}
@AfterClass @JvmStatic fun teardown() {
server.shutdown()
cleanFiles()
resetEnvProxy()
cleanSysProps()
}
private fun cleanSysProps() { ... }
private fun cleanFiles() {
coreWithPluginDir.resolve("data").deleteRecursively()
Files.deleteIfExists(coreWithPluginDir.resolve("core.properties"))
Files.deleteIfExists(coreWithPluginDir.resolve("core.properties.unloaded"))
}
}
val adminClient: SolrClient = HttpSolrClient("http://localhost:8983/solr/")
@Before fun prepareTest() {
}
@After fun cleanupTest() {
unloadCoreIfExists("tempCollection1")
unloadCoreIfExists("tempCollection2")
unloadCoreIfExists("tempCollection3")
}
private fun unloadCoreIfExists(name: String) { ... }
@Test
fun testServerLoadsPlugin() {
println("Loading core 'withplugin' from dir ${coreWithPluginDir.toString()}")
val response = CoreAdminRequest.createCore("tempCollection1", coreWithPluginDir.toString(), adminClient)
assertEquals(0, response.status)
}
}
Ve gömülü bir veritabanı olarak yerel olarak AWS DynamoDB'yi başlatan başka bir başlangıç (Gömülü AWS DynamoDB-local'den biraz kopyalanıp değiştirildi ). Bu test java.library.path
başka bir şey olmadan önce hacklemelidir, aksi takdirde yerel DynamoDB (ikili kitaplıklarla sqlite kullanarak) çalışmayacaktır. Ardından, tüm test sınıfları için paylaşılacak bir sunucu başlatır ve testler arasında geçici verileri temizler. Test:
class TestAccountManager {
companion object {
init {
val dynLibPath = File("./src/test/dynlib/").absoluteFile
System.setProperty("java.library.path", dynLibPath.toString());
val fieldSysPath = ClassLoader::class.java.getDeclaredField("sys_paths")
fieldSysPath.setAccessible(true)
fieldSysPath.set(null, null)
System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.Slf4jLog")
}
private val localDbPort = 19444
private lateinit var localDb: DynamoDBProxyServer
private lateinit var dbClient: AmazonDynamoDBClient
private lateinit var dynamo: DynamoDB
@BeforeClass @JvmStatic fun setup() {
localDb = DynamoDBProxyServer(localDbPort, LocalDynamoDBServerHandler(
LocalDynamoDBRequestHandler(0, true, null, true, true), null)
)
localDb.start()
val auth = BasicAWSCredentials("fakeKey", "fakeSecret")
dbClient = AmazonDynamoDBClient(auth) initializedWith {
signerRegionOverride = "us-east-1"
setEndpoint("http://localhost:$localDbPort")
}
dynamo = DynamoDB(dbClient)
AccountManagerSchema.createTables(dbClient)
dynamo.listTables().forEach { table ->
println(table.tableName)
}
}
@AfterClass @JvmStatic fun teardown() {
dbClient.shutdown()
localDb.stop()
}
}
val jsonMapper = jacksonObjectMapper()
val dynamoMapper: DynamoDBMapper = DynamoDBMapper(dbClient)
@Before fun prepareTest() {
setupStaticBillingData(dbClient)
}
@After fun cleanupTest() {
deleteAllInTable<Account>()
deleteAllInTable<Organization>()
deleteAllInTable<Billing>()
}
private inline fun <reified T: Any> deleteAllInTable() { ... }
@Test fun testAccountJsonRoundTrip() {
val acct = Account("123", ...)
dynamoMapper.save(acct)
val item = dynamo.getTable("Accounts").getItem("id", "123")
val acctReadJson = jsonMapper.readValue<Account>(item.toJSON())
assertEquals(acct, acctReadJson)
}
}
NOT: örneklerin bazı kısımları şu şekilde kısaltılmıştır:...