উত্তর:
যদিও আমি @assylias এর সাথে একমত যে ব্যবহারটি @BeforeClass
একটি সর্বোত্তম সমাধান যা সর্বদা সুবিধাজনক নয়। বর্ণিত পদ্ধতিটি @BeforeClass
অবশ্যই অচল থাকতে হবে। এটি কিছু পরীক্ষার জন্য খুব অসুবিধে হয় যার পরীক্ষার ক্ষেত্রে উদাহরণ প্রয়োজন। উদাহরণস্বরূপ বসন্ত ভিত্তিক পরীক্ষাগুলি যা @Autowired
বসন্ত প্রসঙ্গে নির্ধারিত পরিষেবাদিগুলির সাথে কাজ করতে ব্যবহার করে।
setUp()
এক্ষেত্রে আমি ব্যক্তিগতভাবে টীকা সহ টীকাযুক্ত নিয়মিত পদ্ধতি ব্যবহার করি @Before
এবং আমার কাস্টম static
(!) boolean
পতাকাটি পরিচালনা করি :
private static boolean setUpIsDone = false;
.....
public void setUp() {
if (setUpIsDone) {
return;
}
// do the setup
setUpIsDone = true;
}
setUp()
পদ্ধতিটি সুপারক্লাসে রয়েছে এমন ক্ষেত্রে বাদে এটি কাজ করে - এটি সমাধানের চেষ্টা করার নীচে একটি উত্তর পোস্ট করেছে ।
আপনি ব্যবহার করতে পারেন টীকা :BeforeClass
@BeforeClass
public static void setUpClass() {
//executed only once, before the first test
}
TheClassYouWant.class
নিজের getClass () কলের পরিবর্তে ব্যবহার করতে পারবেন না ? প্রকৃত জাভা হল: String.class.getName()
।
5 ইউনাইট এখন একটি পূর্ববর্তী সমস্ত টিকা আছে:
উল্লেখ করে যে বর্তমান ক্লাস বা শ্রেণি শ্রেণিবিন্যাসের সমস্ত @ টেস্ট পদ্ধতির আগে টিক চিহ্ন দেওয়া পদ্ধতিটি কার্যকর করা উচিত; JUnit 4 এর @BeforeClass এর সাথে সাদৃশ্য। এই জাতীয় পদ্ধতি অবশ্যই অচল থাকতে হবে।
5 ইউনাইটের লাইফসাইकल টিকাগুলি শেষ পর্যন্ত এটি ঠিকই পেয়েছে বলে মনে হচ্ছে! আপনি অনুমান করতে পারেন যে কোন টিকাটি এমনকি সন্ধান ছাড়াই উপলব্ধ eg (উদাহরণস্বরূপ @BeEEEach @ আফটারএল)
@BeforeClass
, এটি করা প্রয়োজন static
। আইএমও @ অ্যালেক্সআরের সমাধানটি ভাল।
যখন setUp()
পরীক্ষার শ্রেণীর একটি সুপারক্লাসে থাকে (উদাহরণস্বরূপ AbstractTestBase
নীচে), গৃহীত উত্তরটি নিম্নরূপে পরিবর্তন করা যেতে পারে:
public abstract class AbstractTestBase {
private static Class<? extends AbstractTestBase> testClass;
.....
public void setUp() {
if (this.getClass().equals(testClass)) {
return;
}
// do the setup - once per concrete test class
.....
testClass = this.getClass();
}
}
এটি একটি একক অ-স্থিতিশীল setUp()
পদ্ধতির জন্য কাজ করা উচিত তবে tearDown()
জটিল প্রতিবিম্বের বিশ্বে ভ্রষ্ট না হয়ে আমি এর সমমানের উত্পাদন করতে অক্ষম ... অনুগ্রহ করে যে যে কেউ পারে!
সম্পাদনা: আমি সবেমাত্র ডিবাগ করার সময় জানতে পারি যে ক্লাসটি প্রতিটি পরীক্ষার আগেই ইনস্ট্যান্ট হয় ated আমি অনুমান করি @ বিফার ক্লাস টীকাটি এখানে সেরা।
আপনিও কন্সট্রাকটর উপর সেট আপ করতে পারেন, পরীক্ষা বর্গ হয় সব পরে একটি বর্গ। আমি এটির খারাপ অভ্যাস কিনা তা নিশ্চিত নই কারণ প্রায় অন্যান্য সমস্ত পদ্ধতির টীকা থাকলেও এটি কার্যকর হয়। আপনি এটির মতো একটি নির্মাণকারী তৈরি করতে পারেন:
public UT () {
// initialize once here
}
@Test
// Some test here...
পরীক্ষাগুলির আগে কর্টরকে ডাকা হবে কারণ সেগুলি অচল নয়।
এই সমাধানটি ব্যবহার করে দেখুন: https://stackoverflow.com/a/46274919/907576 :
সঙ্গে @BeforeAllMethods
/ @AfterAllMethods
টীকা আপনি একটি দৃষ্টান্ত কনটেক্সট, যেখানে সব ইনজেকশনের মান পাওয়া যায় টেস্ট ক্লাসে কোন পদ্ধতি চালানো যেতে পারে।
আমার নোংরা সমাধানটি হ'ল:
public class TestCaseExtended extends TestCase {
private boolean isInitialized = false;
private int serId;
@Override
public void setUp() throws Exception {
super.setUp();
if(!isInitialized) {
loadSaveNewSerId();
emptyTestResultsDirectory();
isInitialized = true;
}
}
...
}
আমি এটি আমার সমস্ত পরীক্ষার কেসগুলির বেস বেস হিসাবে ব্যবহার করি।
আপনি যদি প্রতিটি সাবস্টেটে সেট এবং চেক করা হয় এমন একটি ভেরিয়েবলের জোর জবরদস্তি না করতে চান, তবে এটি একটি সুপারস্টেস্টে যুক্ত করতে পারে:
public abstract class SuperTest {
private static final ConcurrentHashMap<Class, Boolean> INITIALIZED = new ConcurrentHashMap<>();
protected final boolean initialized() {
final boolean[] absent = {false};
INITIALIZED.computeIfAbsent(this.getClass(), (klass)-> {
return absent[0] = true;
});
return !absent[0];
}
}
public class SubTest extends SuperTest {
@Before
public void before() {
if ( super.initialized() ) return;
... magic ...
}
}
আমি এই সমস্যার সমাধান করেছি:
আপনার বেস অ্যাবস্ট্রাক্ট ক্লাসে যুক্ত করুন (আমার বোঝা যাচ্ছে এমন বিমূর্ত শ্রেণি যেখানে আপনি সেটআপড্রাইভার () পদ্ধতিতে আপনার ড্রাইভারটি সূচনা করেন ) কোডের এই অংশটি:
private static boolean started = false;
static{
if (!started) {
started = true;
try {
setUpDriver(); //method where you initialize your driver
} catch (MalformedURLException e) {
}
}
}
এবং এখন, যদি আপনার পরীক্ষার শ্রেণীর প্রসারিত হবে বেজ বিমূর্ত বর্গ -> setUpDriver () পদ্ধতি আগে প্রথম @Test শুধুমাত্র মৃত্যুদন্ড কার্যকর করা হবে এক রান প্রতি সময়।
সমস্ত সূচনা কাজের জন্য বসন্তের @ পোষ্টকনস্ট্রাক্ট পদ্ধতিটি ব্যবহার করুন এবং @ টেস্টের কোনও কার্যকর হওয়ার আগে এই পদ্ধতিটি চলে