এই থ্রেডটি খুঁজে পাওয়া বেশিরভাগ লোকের মতো, আমি কিছু ইউনিট পরীক্ষা লিখছিলাম এবং পরীক্ষাটি চালানোর জন্য সঠিক শর্ত নির্ধারণ করার জন্য পরিবেশের পরিবর্তনশীলগুলি সংশোধন করা দরকার। তবে, আমি খুঁজে পেয়েছি সর্বাধিক উত্সাহিত উত্তরগুলির কিছু সমস্যা ছিল এবং / অথবা খুব ক্রিপ্টিক বা অত্যধিক জটিল। আশা করি এটি অন্যদের সমাধান আরও দ্রুত বাছাই করতে সহায়তা করবে।
প্রথমে, আমি অবশেষে @ হুবার্ট গ্রাজেকোইয়াকের সমাধানটি সবচেয়ে সহজ হিসাবে খুঁজে পেয়েছি এবং এটি আমার পক্ষে কাজ করেছে। আমি আশা করি যে আমি প্রথমে এসেছি। এটি @ অ্যাডওয়ার্ড ক্যাম্পবেলের উত্তরের ভিত্তিতে, তবে লুপ অনুসন্ধানে জটিলতা ছাড়াই।
যাইহোক, আমি @ পুশির সমাধান দিয়ে শুরু করেছি, যা সর্বাধিক উত্সাহ পেয়েছে। এটি @ বেনামে এবং @ অ্যাডওয়ার্ড ক্যাম্পবেলের একটি কম্বো। @ পুশি দাবি করেছেন যে লিনাক্স এবং উইন্ডোজ উভয় পরিবেশকেই আবরণ করার জন্য উভয় পদ্ধতিরই প্রয়োজন। আমি ওএস এক্স এর অধীনে চলেছি এবং উভয়ই কাজ খুঁজে পেয়েছি (একবার @ বেনামে পদ্ধতির কোনও সমস্যা স্থির হয়ে গেছে)। অন্যরা যেমন উল্লেখ করেছে যে এই সমাধানটি বেশিরভাগ সময় কার্যকর হয় তবে সমস্তটি নয়।
আমি মনে করি বেশিরভাগ বিভ্রান্তির উত্স @ বেনামের সমাধান 'দ্য এনভায়রনমেন্ট' ক্ষেত্রে কাজ করে from প্রক্রিয়া পরিবেশের পরিবেশ কাঠামোর তাকানো, 'দ্য এনভায়রনমেন্ট' কোনও মানচিত্র <স্ট্রিং, স্ট্রিং> নয় বরং এটি মানচিত্র <পরিবর্তনশীল, মান> ue মানচিত্র সাফ করা ঠিকঠাক কাজ করে তবে পুটএল অপারেশন মানচিত্রটিকে একটি মানচিত্র <স্ট্রিং, স্ট্রিং> পুনর্নির্মাণ করে, যা পরবর্তীকালে অপারেশনগুলি স্বাভাবিক এপিআই ব্যবহার করে ডেটা স্ট্রাকচারে অপারেশন করে যখন সম্ভাব্যত সমস্যা তৈরি করে যা মানচিত্র <পরিবর্তনশীল, মান> আশা করে। এছাড়াও, পৃথক উপাদান অ্যাক্সেস / অপসারণ একটি সমস্যা। সমাধানটি 'TheUnmodifiableEnटका' এর মাধ্যমে অপ্রত্যক্ষভাবে 'পরিবেশ' অ্যাক্সেস করা। তবে যেহেতু এটি টাইপ আনমোডিফাইয়েবল ম্যাপ সংজ্ঞাটি দেখে অ্যাক্সেসটি আনমোডেফাইয়েবলম্যাপ টাইপের ব্যক্তিগত ভেরিয়েবল 'এম' এর মাধ্যমে করতে হবে। নীচের কোডে getModifiableEnomotMap2 দেখুন।
আমার ক্ষেত্রে আমার পরীক্ষার জন্য কিছু পরিবেশের ভেরিয়েবল অপসারণ করা দরকার (অন্যগুলি অপরিবর্তিত হওয়া উচিত)। তারপরে আমি পরীক্ষার পরে পরিবেশের পরিবর্তনগুলি তাদের পূর্বের অবস্থায় ফিরিয়ে আনতে চেয়েছিলাম। নীচের রুটিনগুলি তা করতে সরাসরি এগিয়ে দেয়। আমি ওএস এক্স-তে getModifiableEnਵਰমেন্টম্যাপের উভয় সংস্করণ পরীক্ষা করেছি এবং উভয়ই সমানভাবে কাজ করে। যদিও এই থ্রেডের মন্তব্যের ভিত্তিতে, পরিবেশের উপর নির্ভর করে অন্যের চেয়ে ভাল পছন্দ হতে পারে।
দ্রষ্টব্য: আমি 'কেসআইসেন্সিটিভ এএনভায়রনফিল্ড' এ অ্যাক্সেস অন্তর্ভুক্ত করি নি যেহেতু এটি উইন্ডোজ নির্দিষ্ট বলে মনে হচ্ছে এবং এটি পরীক্ষা করার আমার কাছে কোনও উপায় ছিল না, তবে এটি যুক্ত করা সরাসরি হওয়া উচিত।
private Map<String, String> getModifiableEnvironmentMap() {
try {
Map<String,String> unmodifiableEnv = System.getenv();
Class<?> cl = unmodifiableEnv.getClass();
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Map<String,String> modifiableEnv = (Map<String,String>) field.get(unmodifiableEnv);
return modifiableEnv;
} catch(Exception e) {
throw new RuntimeException("Unable to access writable environment variable map.");
}
}
private Map<String, String> getModifiableEnvironmentMap2() {
try {
Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
Field theUnmodifiableEnvironmentField = processEnvironmentClass.getDeclaredField("theUnmodifiableEnvironment");
theUnmodifiableEnvironmentField.setAccessible(true);
Map<String,String> theUnmodifiableEnvironment = (Map<String,String>)theUnmodifiableEnvironmentField.get(null);
Class<?> theUnmodifiableEnvironmentClass = theUnmodifiableEnvironment.getClass();
Field theModifiableEnvField = theUnmodifiableEnvironmentClass.getDeclaredField("m");
theModifiableEnvField.setAccessible(true);
Map<String,String> modifiableEnv = (Map<String,String>) theModifiableEnvField.get(theUnmodifiableEnvironment);
return modifiableEnv;
} catch(Exception e) {
throw new RuntimeException("Unable to access writable environment variable map.");
}
}
private Map<String, String> clearEnvironmentVars(String[] keys) {
Map<String,String> modifiableEnv = getModifiableEnvironmentMap();
HashMap<String, String> savedVals = new HashMap<String, String>();
for(String k : keys) {
String val = modifiableEnv.remove(k);
if (val != null) { savedVals.put(k, val); }
}
return savedVals;
}
private void setEnvironmentVars(Map<String, String> varMap) {
getModifiableEnvironmentMap().putAll(varMap);
}
@Test
public void myTest() {
String[] keys = { "key1", "key2", "key3" };
Map<String, String> savedVars = clearEnvironmentVars(keys);
// do test
setEnvironmentVars(savedVars);
}