Я не думаю, что возможно сделать это с Timer/TimerTask
, но в зависимости от того, что точно Вы хотите достигнуть Вас, могло бы быть довольно использованием java.util.concurrent.ScheduledThreadPoolExecutor
.
С точки зрения тестовых сред мне нравится использовать Test :: Class , который позволяет вам настраивать хорошие иерархии модульных тестов аналогично JUnit. Связанная документация дает довольно хороший обзор, хотя, если вы еще не знакомы с соглашениями о тестировании Perl, ознакомьтесь с документацией для Test :: Simple и TAP , который является стандартом. выходной формат для тестов Perl.
Для имитации существует Test :: Mock :: Class , который полезен для настройки фиктивных классов для библиотек, находящихся вне вашего прямого контроля, например модулей CPAN, на которые опирается ваше приложение.
Там также отличный Test :: MockDBI , который предоставляет специальные средства для имитации ваших баз данных.
Просто добавлю немного о BDD, потому что ответ friedo, я думаю, охватывает все остальное.
Взгляните на это обсуждение Perlmonks. Behavior Driven Development: рекомендуемые инструменты для Perl ?
Я думаю, что некоторые инструменты могут указать вам правильное направление:
См. Также это SO вопрос: Можете ли вы просмотреть мою переписанную Perl версию Cucumber?
Надеюсь, что часть этого поможет.
/ I3az /
В последнее время, с MooseX :: Declare , я использовал «реальные объекты» в качестве имитирующих объектов.
Допустим, у вас есть драйвер базы данных, который выполняет интерфейс вроде этого:
role Database {
requires 'connect';
requires 'query';
};
Тогда у вас есть такой код, который использует базу данных:
class FooPage {
has 'database' => (
is => 'ro',
does => 'Database',
required => 1,
);
method get_foo() {
$self->database->query({ foo => 42 });
}
method render_page(Str $user) {
"Hello, $user. Here is a foo for you: ". $self->get_foo;
}
};
Теперь вы хотите протестировать это:
use Test::More tests => 2;
use MooseX::Declare;
my $fake_database = class with Database {
has 'data' => ( is => 'ro', isa => 'HashRef' );
has 'connected' => ( is => 'rw', isa => 'Bool' );
method connect() { $self->connected(1) }
method query(HashRef $query) { $self->data->{$query->{foo}} }
};
my $test_database = $fake_database->name->new(
data => {
42 => 'OH HAI',
},
};
my $foo_page = FooPage->new( database => $test_database );
is $foo_page->get_foo, 'OH HAI', 'got correct foo';
is $foo_page->render_page('jrockway'),
'Hello, jrockway. Here is a foo for you: OH HAI',
'got rendered page';
Обратите внимание, насколько у вас сжатый синтаксис, но вся мощь «настоящего» Класс Moose как ваш фиктивный объект. Удобно и бесконечно гибко.
(Это всего лишь примеры ... это могло быть что-то намного лучше.)
Это не фреймворк, но одна из лучших книг по тестированию - отличная Perl Testing: A Developer's Notebook , в которой также есть рекомендации по тестовым фреймворкам для Perl, например Test :: More
.