JUnit сынақ қондырғысында уақыт пен күнді орнату

Java-кодтың бір бөлігі ретінде ертең Ю.Н.

Мысалы, 3 тапсырма бар:

  • task1 - орындалды
  • task2 - ертең жасаңыз
  • task3 - бұл оқиға
  • болады

Сондықтан бүгінгі күнді ертеңгі күнде Java ретінде орнату қажет.

5
Сондай-ақ,
қосылды автор Raedwald, көзі
Сондай-ақ,
қосылды автор Raedwald, көзі
Сіз өзіңіздің сынақтарыңыздың көзін көрсете аласыз ба?
қосылды автор tbsalling, көзі
Мен кез-келген кадрлармен жұмыс істеудің қажеті жоқ .i үш тәсілмен calls.f1() -> f2() -> f3() сияқты бір-бірінен кейін үш тапсырма ғана бар. f2 ертең жасалуы мүмкін, содан кейін f3 деп аталады.
қосылды автор hi5, көзі

8 жауаптар

Мәселеңіздің түбірі - жүйелік сағаттар (сізде new Date() ішіндегі уақытты беретін)) сізге сынақ үшін қажет уақытты бермейді.

Сіз бұл проблемадан аулақ бола аласыз. Кодыңызды Java API-ға ағымдағы уақыттың орнына тікелей қоюдың орнына, сіздің кодыңызда Clock нысанын уақыттың не екенін сұраңыз. Нақты бағдарламаңызда Clock қолданбасы жүйелік сағатты пайдаланады. Бірліктеріңіздің тесттері үшін FakeClock қолданыңыз. тәуелділікті инъекциялау пайдалану үшін Clock деген кодты айтасыз. Clock интерфейсін (немесе дерексіз негіздік сыныпты) және оның нақты енгізулерін өзіңіз жазыңыз.

Бұл тәсіл сіздің қолданыстағы кодты өзгертуді талап етеді, сондықтан тестілеуді оңайырақ ету үшін тестілеу немесе оны бірінші кезекте жазу оңайырақ. Бұл бірлік сынақтарының бірі.

Уақытты анықтайтын сәтте кейбір кодта жұмыс істеймін. My clock интерфейсі жай

 public interface Clock {
    long getCurrentTime ();
 }
9
қосылды

Мәселеңіздің түбірі - жүйелік сағаттар (сізде new Date() ішіндегі уақытты беретін)) сізге сынақ үшін қажет уақытты бермейді.

Сіз бұл проблемадан аулақ бола аласыз. Кодыңызды Java API-ға ағымдағы уақыттың орнына тікелей қоюдың орнына, сіздің кодыңызда Clock нысанын уақыттың не екенін сұраңыз. Нақты бағдарламаңызда Clock қолданбасы жүйелік сағатты пайдаланады. Бірліктеріңіздің тесттері үшін FakeClock қолданыңыз. тәуелділікті инъекциялау пайдалану үшін Clock деген кодты айтасыз. Clock интерфейсін (немесе дерексіз негіздік сыныпты) және оның нақты енгізулерін өзіңіз жазыңыз.

Бұл тәсіл сіздің қолданыстағы кодты өзгертуді талап етеді, сондықтан тестілеуді оңайырақ ету үшін тестілеу немесе оны бірінші кезекте жазу оңайырақ. Бұл бірлік сынақтарының бірі.

Уақытты анықтайтын сәтте кейбір кодта жұмыс істеймін. My clock интерфейсі жай

 public interface Clock {
    long getCurrentTime ();
 }
9
қосылды

Кілті тәуелділік ретінде «ағымдағы уақытты бере алатын нәрсе» идеясын шығару болып табылады. (Тиісті уақыт белдеуімен бірге).

Сондықтан жаңа Date() немесе System.currentTimeMillis() пайдалану орнына Clock абстракцияны қолданыңыз. Өндіріс коды үшін сіз базалық жүйе сағатын пайдаланатын бұл мысалды енгізесіз, бірақ тестілеу үшін сіз нақты бақылауға болатын жалған сағатты пайдаланасыз, ол сізге кез келген нәрсені қайтаруға мүмкіндік береді.

(Шындығында, шын мәнінде неге қол жеткізуге тырысатыныңыз анық емес, бірақ бұл тәсіл уақытты тексеруге арналған стандартты көзқарас болып табылады.)

5
қосылды

Кілті тәуелділік ретінде «ағымдағы уақытты бере алатын нәрсе» идеясын шығару болып табылады. (Тиісті уақыт белдеуімен бірге).

Сондықтан жаңа Date() немесе System.currentTimeMillis() пайдалану орнына Clock абстракцияны қолданыңыз. Өндіріс коды үшін сіз базалық жүйе сағатын пайдаланатын бұл мысалды енгізесіз, бірақ тестілеу үшін сіз нақты бақылауға болатын жалған сағатты пайдаланасыз, ол сізге кез келген нәрсені қайтаруға мүмкіндік береді.

(Шындығында, шын мәнінде неге қол жеткізуге тырысатыныңыз анық емес, бірақ бұл тәсіл уақытты тексеруге арналған стандартты көзқарас болып табылады.)

5
қосылды

Consider the following code on GitHub: DateSupplier && DateController. DateSupplier has a static method that returns the current date. DateController allow you to manipulate the date value that is returned by DateSupplier in a test environment. It is a JUnit Rule and cleans up after itself.

Бұл басқа екі жауаптан Clock идеясын нақты іске асыру. Мен оны жобаларға бір жыл немесе одан да жақсы жетістіктермен қолдана бастадым. new Date() жасайтын коды бар кез келген уақытта орнына DateSupplier.getCurrentDate() деп атаймын.

3
қосылды

Consider the following code on GitHub: DateSupplier && DateController. DateSupplier has a static method that returns the current date. DateController allow you to manipulate the date value that is returned by DateSupplier in a test environment. It is a JUnit Rule and cleans up after itself.

Бұл басқа екі жауаптан Clock идеясын нақты іске асыру. Мен оны жобаларға бір жыл немесе одан да жақсы жетістіктермен қолдана бастадым. new Date() жасайтын коды бар кез келген уақытта орнына DateSupplier.getCurrentDate() деп атаймын.

3
қосылды

Joda Time -ті пайдалануды қарастырыңыз, ол Java күн мен уақыт сабақтарын ауыстырады. Ол қамтамасыз етеді

DateTimeUtils.setCurrentMillisFixed(long millis);

ол сіздің сынақтарыңызда қолданылуы мүмкін.

2
қосылды
+1. Мен уақытты шектеулі сынақ нұсқасын орнатып, Joda Time-ті уақыт туралы жауаптарымен көріп отырмын. Бұл мәселе Joda Time уақытқа өзгерді. Оны орнату үшін бір сағаттан аз уақыт қажет болды, оны пайдалану үшін кодты өзгертіп, осы ұсыныспен тестімді орнаттым.
қосылды автор Stephen Hosking, көзі
Қоңырау DateTimeUtils.setCurrentMillisFixed (...) болуы керек. Бұл белгілі бір күн уақытын белгілеуге шақыру. DateTimeUtils.setCurrentMillisSystem() (параметрсіз) ағымдағы уақытты пайдалану үшін DateTime параметрін орнатады. joda.org/joda-time/apidocs/index.html бөлімін қараңыз.
қосылды автор Stephen Hosking, көзі

Joda Time -ті пайдалануды қарастырыңыз, ол Java күн мен уақыт сабақтарын ауыстырады. Ол қамтамасыз етеді

DateTimeUtils.setCurrentMillisFixed(long millis);

ол сіздің сынақтарыңызда қолданылуы мүмкін.

2
қосылды
+1. Мен уақытты шектеулі сынақ нұсқасын орнатып, Joda Time-ті уақыт туралы жауаптарымен көріп отырмын. Бұл мәселе Joda Time уақытқа өзгерді. Оны орнату үшін бір сағаттан аз уақыт қажет болды, оны пайдалану үшін кодты өзгертіп, осы ұсыныспен тестімді орнаттым.
қосылды автор Stephen Hosking, көзі
Қоңырау DateTimeUtils.setCurrentMillisFixed (...) болуы керек. Бұл белгілі бір күн уақытын белгілеуге шақыру. DateTimeUtils.setCurrentMillisSystem() (параметрсіз) ағымдағы уақытты пайдалану үшін DateTime параметрін орнатады. joda.org/joda-time/apidocs/index.html бөлімін қараңыз.
қосылды автор Stephen Hosking, көзі