সর্বাধিক সমাধান হবে
- পরীক্ষাটি শেষ করুন (পদ্ধতিটি, পুরো রান নয়) মুহুর্তটি
System.exit()
বলা হয়
- ইতিমধ্যে ইনস্টল করা উপেক্ষা করুন
SecurityManager
- কখনও কখনও একটি পরীক্ষার কাঠামোর সাথে বেশ সুনির্দিষ্ট হতে হবে
- প্রতি পরীক্ষার ক্ষেত্রে একবারে সর্বোচ্চ ব্যবহার করতে সীমাবদ্ধ করুন
সুতরাং, বেশিরভাগ সমাধান পরিস্থিতিগুলির জন্য উপযুক্ত নয় যেখানে:
- পার্শ্ব প্রতিক্রিয়া যাচাইকরণ কল করার পরে করা উচিত
System.exit()
- একটি বিদ্যমান সুরক্ষা পরিচালক পরীক্ষার অংশ।
- একটি ভিন্ন পরীক্ষার কাঠামো ব্যবহৃত হয়।
- আপনি একটি একক পরীক্ষার ক্ষেত্রে একাধিক যাচাইকরণ থাকতে চান। এটি কঠোরভাবে সুপারিশ করা হতে পারে না, তবে এটি অনেক সময় খুব সুবিধাজনক হতে পারে, বিশেষত এর মিশ্রণে
assertAll()
, উদাহরণস্বরূপ।
অন্যান্য উত্তরে উপস্থাপিত বিদ্যমান সমাধানগুলির দ্বারা আরোপিত নিষেধাজ্ঞাগুলি নিয়ে আমি সন্তুষ্ট নই এবং এইভাবে আমি নিজেই কিছু নিয়ে এসেছি।
নিম্নলিখিত ক্লাসটি এমন একটি পদ্ধতি সরবরাহ করে assertExits(int expectedStatus, Executable executable)
যা দাবি করে যে System.exit()
নির্দিষ্ট status
মান সহ ডাকা হয় এবং তার পরে পরীক্ষাটি চালিয়ে যেতে পারে। এটি JUnit 5 এর মতোই কাজ করে assertThrows
। এটি কোনও বিদ্যমান সুরক্ষা ব্যবস্থাপককে শ্রদ্ধা করে।
বাকি একটি সমস্যা রয়েছে: যখন পরীক্ষার অধীনে কোডটি একটি নতুন সুরক্ষা পরিচালক ইনস্টল করে যা পরীক্ষার দ্বারা নির্ধারিত সুরক্ষা ব্যবস্থাপককে পুরোপুরি প্রতিস্থাপন করে। SecurityManager
আমার জানা সমস্ত অন্যান্য ভিত্তিক সমাধান একই সমস্যায় ভুগছে।
import java.security.Permission;
import static java.lang.System.getSecurityManager;
import static java.lang.System.setSecurityManager;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
public enum ExitAssertions {
;
public static <E extends Throwable> void assertExits(final int expectedStatus, final ThrowingExecutable<E> executable) throws E {
final SecurityManager originalSecurityManager = getSecurityManager();
setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(final Permission perm) {
if (originalSecurityManager != null)
originalSecurityManager.checkPermission(perm);
}
@Override
public void checkPermission(final Permission perm, final Object context) {
if (originalSecurityManager != null)
originalSecurityManager.checkPermission(perm, context);
}
@Override
public void checkExit(final int status) {
super.checkExit(status);
throw new ExitException(status);
}
});
try {
executable.run();
fail("Expected System.exit(" + expectedStatus + ") to be called, but it wasn't called.");
} catch (final ExitException e) {
assertEquals(expectedStatus, e.status, "Wrong System.exit() status.");
} finally {
setSecurityManager(originalSecurityManager);
}
}
public interface ThrowingExecutable<E extends Throwable> {
void run() throws E;
}
private static class ExitException extends SecurityException {
final int status;
private ExitException(final int status) {
this.status = status;
}
}
}
আপনি ক্লাসটি এভাবে ব্যবহার করতে পারেন:
@Test
void example() {
assertExits(0, () -> System.exit(0)); // succeeds
assertExits(1, () -> System.exit(1)); // succeeds
assertExits(2, () -> System.exit(1)); // fails
}
কোডটি সহজেই প্রয়োজনে JUnit 4, TestNG, বা অন্য কোনও কাঠামোতে পোর্ট করা যেতে পারে। একমাত্র ফ্রেমওয়ার্ক-নির্দিষ্ট উপাদান পরীক্ষায় ব্যর্থ হচ্ছে। এটি সহজেই ফ্রেমওয়ার্ক-স্বাধীন কিছুতে পরিবর্তন করা যেতে পারে ( জুনিট 4 বাদে) Rule
উন্নতির জন্য জায়গা রয়েছে, উদাহরণস্বরূপ, assertExits()
কাস্টমাইজযোগ্য বার্তাগুলি দিয়ে ওভারলোডিং ।