একটি সাধারণ সমস্যা আছে: সময়কে উপহাস করা শক্ত। এছাড়াও, একটি ইউনিট পরীক্ষায় দীর্ঘ চলমান / অপেক্ষার কোড স্থাপন করা সত্যিই খারাপ অভ্যাস।
সুতরাং, একটি নির্ধারিত এপিআই পরীক্ষারযোগ্য করার জন্য, আমি এই জাতীয় এবং একটি মক বাস্তবায়ন সহ একটি ইন্টারফেস ব্যবহার করেছি:
public interface Clock {
public long getCurrentMillis();
public void sleep(long millis) throws InterruptedException;
}
public static class SystemClock implements Clock {
@Override
public long getCurrentMillis() {
return System.currentTimeMillis();
}
@Override
public void sleep(long millis) throws InterruptedException {
Thread.sleep(millis);
}
}
public static class MockClock implements Clock {
private final AtomicLong currentTime = new AtomicLong(0);
public MockClock() {
this(System.currentTimeMillis());
}
public MockClock(long currentTime) {
this.currentTime.set(currentTime);
}
@Override
public long getCurrentMillis() {
return currentTime.addAndGet(5);
}
@Override
public void sleep(long millis) {
currentTime.addAndGet(millis);
}
}
এটির সাহায্যে আপনি নিজের পরীক্ষায় সময় নকল করতে পারেন:
@Test
public void testExipres() {
MockClock clock = new MockClock();
SomeCacheObject sco = new SomeCacheObject();
sco.putWithExipration("foo", 1000);
clock.sleep(2000)
assertNull(sco.getIfNotExpired("foo"));
}
এর জন্য একটি উন্নত মাল্টি-থ্রেডিং মক Clockঅবশ্যই আরও জটিল, তবে আপনি এটি ThreadLocalউল্লেখ এবং একটি ভাল সময়ের সিঙ্ক্রোনাইজেশন কৌশল দ্বারা তৈরি করতে পারেন , উদাহরণস্বরূপ।
Thread.sleepমতো কিছু বলার বিষয়ে অভিযোগ করবেন s একটি পরীক্ষায় ঘুমান কেবল একটি খারাপ ধারণা। এটি ভঙ্গুর পরীক্ষা তৈরি করে যা পরিবেশের উপর নির্ভর করে ("আমার মেশিনে পাস!") বা লোডের উপর নির্ভর করে অনাকাঙ্ক্ষিতভাবে ব্যর্থ হতে পারে। টাইমিংয়ের উপর নির্ভর করবেন না (মক ব্যবহার করুন) বা অ্যাসিঙ্ক্রোনাস পরীক্ষার জন্য ওয়েবেটিলিটির মতো লাইব্রেরি ব্যবহার করবেন না।