आपके यूनिट परीक्षण वर्ग को आमतौर पर परीक्षण विधियों के एक समूह के लिए साझा संसाधन का प्रबंधन करने के लिए कुछ चीजों की आवश्यकता होती है। और कोटलिन में आप उपयोग कर सकते हैं @BeforeClass
और @AfterClass
टेस्ट क्लास में नहीं, बल्कि एनोटेशन के साथ इसके साथी ऑब्जेक्ट के भीतर ।@JvmStatic
एक परीक्षण वर्ग की संरचना इस तरह दिखाई देगी:
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() {
}
}
उपरोक्त को देखते हुए, आपको इसके बारे में पढ़ना चाहिए:
- साथी वस्तुएं - जावा में क्लास ऑब्जेक्ट के समान, लेकिन प्रति क्लास एक सिंगलटन जो स्थिर नहीं है
@JvmStatic
- एक एनोटेशन जो जावा इंटरोप के लिए बाहरी वर्ग पर एक स्थैतिक विधि में एक साथी ऑब्जेक्ट विधि को बदल देता है
lateinit
- var
जब आप एक अच्छी तरह से परिभाषित जीवनचक्र रखते हैं, तो एक संपत्ति को बाद में आरंभ करने की अनुमति देता है
Delegates.notNull()
- lateinit
एक संपत्ति के बदले इस्तेमाल किया जा सकता है जिसे पढ़ने से पहले कम से कम एक बार सेट किया जाना चाहिए।
कोटलिन के लिए परीक्षण कक्षाओं के पूर्ण उदाहरण हैं जो एम्बेडेड संसाधनों का प्रबंधन करते हैं।
पहले को सॉल-अंडरट्रॉ परीक्षणों से कॉपी और संशोधित किया जाता है , और परीक्षण मामलों को चलाने से पहले, एक सोलर-अंडरट्रॉ सर्वर को कॉन्फ़िगर और शुरू करता है। परीक्षण चलने के बाद, यह परीक्षणों द्वारा बनाई गई किसी भी अस्थायी फाइल को साफ करता है। यह सुनिश्चित करता है कि पर्यावरण चर और सिस्टम गुण परीक्षण चलाने से पहले सही हैं। परीक्षण मामलों के बीच यह किसी भी अस्थायी लोड किए गए सोल्र कोर को उतारता है। कसौटी:
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)
}
}
और एक अन्य AWS डायनमोडीबी स्थानीय को एक एम्बेडेड डेटाबेस के रूप में शुरू कर रहा है (प्रतिलिपि बनाई गई और AWS डायनेमोडीबी-स्थानीय एम्बेडेड रनिंग से थोड़ा संशोधित )। java.library.path
कुछ भी होने या स्थानीय डायनमोडीबी (द्विआधारी पुस्तकालयों के साथ साइक्लाइट का उपयोग करने से पहले) यह परीक्षण हैक नहीं होगा। फिर यह सभी परीक्षण कक्षाओं के लिए साझा करने के लिए एक सर्वर शुरू करता है, और परीक्षणों के बीच अस्थायी डेटा को साफ करता है। कसौटी:
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)
}
}
नोट: उदाहरणों के कुछ भागों के साथ संक्षिप्त किया गया है...