কোটলিন এবং নতুন ক্রিয়াকলাপ টেস্টরুল: @ বিধিটি সর্বজনীন হতে হবে


264

আমি কোটলিনে আমার অ্যান্ড্রয়েড অ্যাপের জন্য ইউআই পরীক্ষা করার চেষ্টা করছি। ক্রিয়াকলাপ টেস্টরুল ব্যবহার করে নতুন সিস্টেম যেহেতু আমি এটিকে কাজ করতে পারি না: এটি সঠিকভাবে সংকলন করে এবং রানটাইম এ, আমি পাই:

java.lang.Exception: The @Rule 'mActivityRule' must be public.
    at org.junit.internal.runners.rules.RuleFieldValidator.addError(RuleFieldValidator.java:90)
    at org.junit.internal.runners.rules.RuleFieldValidator.validatePublic(RuleFieldValidator.java:67)
    at org.junit.internal.runners.rules.RuleFieldValidator.validateField(RuleFieldValidator.java:55)
    at org.junit.internal.runners.rules.RuleFieldValidator.validate(RuleFieldValidator.java:50)
    at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:170)
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:344)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
    at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:38)
    at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
    at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:57)
    at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:45)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runner.Computer.getRunner(Computer.java:38)
    at org.junit.runner.Computer$1.runnerForClass(Computer.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84)
    at org.junit.runners.Suite.<init>(Suite.java:79)
    at org.junit.runner.Computer.getSuite(Computer.java:26)
    at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:691)
    at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:654)
    at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:329)
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:226)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)

আমি এখানে এমএসিটিভিটি রুল ঘোষণা করেছি:

RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {

    Rule
    public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())

   ...
}

এটি ইতিমধ্যে প্রকাশ্য: /


3
বর্তমানে, কোটলিন এমন ক্ষেত্রগুলি তৈরির পক্ষে সমর্থন করে না যা সম্পত্তিগুলিকে জনসাধারণের পক্ষে সমর্থন করে তবে আমরা এটিতে কাজ করছি
আন্দ্রে ব্রেস্লাভ

এটি কি কোনও বাগ ট্র্যাক করছে?
জিওব-ও-ম্যাটিক

উত্তর:


316

JUnit একটি পরীক্ষার শ্রেণীর ক্ষেত্র বা একটি গেটর পদ্ধতির মাধ্যমে নিয়ম সরবরাহ করার অনুমতি দেয়।

আপনি যা মন্তব্য করেছেন তা হ'ল কোটলিনে একটি সম্পত্তি , যা ইউনিত স্বীকৃতি দেবে না।

কোটলিনে JUnit বিধি নির্দিষ্ট করার সম্ভাব্য উপায়গুলি এখানে:

একটি এনোটোটেড গেটর পদ্ধতির মাধ্যমে

এম 13 থেকে , টিকা প্রসেসর টিকা লক্ষ্যগুলিকে সমর্থন করে । আপনি যখন লিখুন

@Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())

যদিও, টীকাটি propertyডিফল্টরূপে লক্ষ্যটি ব্যবহার করবে (জাভাতে দৃশ্যমান নয়)।

আপনি যাইহোক সম্পত্তি প্রাপ্তিটিকে বৌদ্ধিক করতে পারেন, এটি সর্বজনীন এবং এইভাবে কোনও নিয়ম প্রাপ্তির জন্য JUnit প্রয়োজনীয়তা পূরণ করে:

@get:Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())

বিকল্পভাবে, আপনি কোনও সম্পত্তির পরিবর্তে কোনও ফাংশন দিয়ে নিয়মটি সংজ্ঞায়িত করতে পারেন (ম্যানুয়ালি একই ফলাফলটি প্রাপ্ত হিসাবে @get:Rule)।

একটি টীকাযুক্ত পাবলিক ফিল্ডের মাধ্যমে

কোটলিন যেহেতু বিটা প্রার্থীকে জেভিএমের ক্ষেত্রগুলিতে নির্ধারিতভাবে বৈশিষ্ট্যগুলি সংকলন করতে দেয়, সেক্ষেত্রে এনোটেশন এবং সংশোধক উত্পন্ন ক্ষেত্রের ক্ষেত্রে প্রযোজ্য। @ Jkschneider এর উত্তর অনুসারে কোটলিনের@JvmField সম্পত্তি টীকাটি ব্যবহার করে এটি করা হয় ।


সাইড নোট: প্রিফিক্স নিশ্চিত করা Ruleএকটি সঙ্গে টীকা @হিসাবে এটি এখন চরিত্র টীকা শুধু সমর্থিত সিনট্যাক্স এবং এড়ানোর @publicFieldযেমন শীঘ্রই বাদ করা হবে না


এটা কি পারে? আমি এখনও ত্রুটি পেয়েছি এবং এটি এম 14 (0.14.449)
প্রকাশিত

@ পাবলিক ফিল্ডের প্রয়োজন বলে মনে হচ্ছে, তবে এটি অবহিত করা হয়েছে, তাই আইডিইর পরামর্শ অনুসারে আমি ল্যাটিনাইট চেষ্টা করেছি, তবে তখন আমার এই কথাটি ঘেউ ঘেউ করে যে লেটিনাইটটি কেবল পরিবর্তনীয় ক্ষেত্রে প্রয়োগ করা যেতে পারে (ব্লগের নিবন্ধটি অন্যথায় বলে…)
জিওব-ও-ম্যাটিক

1
আমার উত্তর আপডেট করেছে;) তবে lateinit val, এম 14 তে এটি সরিয়ে ফেলা হয়েছে কারণ এটি ক্ষেত্রের অপরিবর্তনীয়তা পুরোপুরি কার্যকর করে না, [এম 14 প্রকাশের ব্লগ পোস্ট] দেখুন (ব্লগ.জেটব্রিনস / কোটলিন/2015 / 10 / কোটলিন- M14-is-আউট /)।
ডেসিম

@ বিজেট কী? এটা আমার পরিস্থিতিতে কাজ করে না।
aleksandrbel

252

কোটলিন 1.0.0+ সহ, এটি কাজ করে:

@Rule @JvmField 
val mActivityRule = ActivityTestRule(MainActivity::class.java)

1
এবং এটি লিন্টের সরঞ্জামটির অভিযোগটি সমাধান করে যে জনসাধারণকে এই নিয়মের যোগ্যতা ছিল অনর্থক ining
রব

হ্যাঁ \ @ জেভিএমফিল্ড অত্যন্ত গুরুত্বপূর্ণ বা এর পরিবর্তে ব্যবহার করুন get @ বিট: বিধি
মাইকেল

শুধুমাত্র চূড়ান্ত ক্ষেত্রে কাজ করে। মত একটি নিয়ম জন্য কাজ করবে না var wireMockRule = WireMockRule(wireMockConfig().dynamicPort())
অভিজিৎ সরকার


12

কোটলিন 1.0.4 সহ:

val mActivityRule: ...
    @Rule get


10
@ জিগনেশআনসোদারিয়া - আমি একটি চেক করেছি এবং এই উত্তরটি যা জিজ্ঞাসা করা হয়েছে তার উত্তর সরবরাহ করে। এটি কীভাবে কাজ করছে সে সম্পর্কে আরও তথ্য নীচের লিঙ্কে পাওয়া যাবে - কোটলিংআং.আর
গুপ্ত

এই পদ্ধতির সাথে একটি সমস্যা আছে। আপনি যদি পরীক্ষার অধীনে ক্রিয়াকলাপটি অ্যাক্সেস করতে চান (উদাহরণস্বরূপ: assertTrue (কার্যকলাপRule.activity.isFinishing)), সম্পত্তি প্রাপ্তকারীকে ডাকা হবে, এভাবে একটি নতুন নিয়ম তৈরি করা হবে। এক্ষেত্রে কার্যকলাপের নিয়ম.অ্যাক্টিভিটি নਾਲ হবে
মকভকাস্টার

0

পরিবর্তে @Rule, আপনার ব্যবহার করা উচিত @get:Rule

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.