Я использую java.awt.Robot
. Не хорошо, не легок, но работает каждый раз.
Профессионалы:
Недостатки:
Теперь, если бы у Вас есть бюджет, я пошел бы для LoadRunner. Лучше всего в классе.
(Раскрытие: отношения к компании, которая владеет LR, но я работал с LR перед отношениями)
Я не особо знаком с этими форматами, но я бы создал простой объект передачи данных, который представляет объект вашего общего календарного события. Он ничего не делает, кроме хранения данных (псевдокод):
class CalendarEvent
{
DateTime Date { get; }
string Title { get; }
string Description { get; }
}
Затем вы создаете интерфейс для CalendarEventReader и CalendarEventWriter (это шаблон Strategy и, возможно, шаблон Builder , вроде того):
interface ICalendarEventReader
{
CalendarEvent Read(Stream data);
// Add additional methods if needed e.g.:
string GetTitleOnly(Stream data);
}
interface ICalendarEventWriter
{
Stream Write(CalendarEvent event);
// Add additional methods if needed e.g.:
Stream WriteSummaryOnly(CalendarEvent event);
}
. Затем укажите в реальных реализациях указанные выше интерфейсы. По одному для каждого формата. Вы даже можете подумать о том, чтобы читатель и писатель находились в одном классе:
class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
...
}
Тогда у вас будет репозиторий (это шаблон Factory , возможно, с Singleton ), который поддерживает список Реализации ICalenderEventReader / Writer для разных форматов:
static class CalenderEventConverterRepository
{
static ICalendarEventReader GetReader(string formatName /*or any other data upon wich to decide wich format is needed*/)
{
...
}
static ICalendarEventReader GetWriter(string formatName /*or any other data upon wich to decide wich format is needed*/)
{
...
}
}
Если формат vCal обновлен, вам придется изменить любой код, который вы написали, в зависимости от того, какой шаблон проектирования вы используете (если только они не решат переключиться на что-то вроде ASN.1, где обновления запекаются) .
Я бы создал интерфейс формата с методами импорта и экспорта и, возможно, с метаданными и методами для проверки того, может ли случайный бит XML соответствовать этому формату. Затем для каждого формата у вас есть объект, реализующий этот интерфейс. Это своего рода «шаблон разработки стратегии», но каждый формат представляет несколько стратегий для выполнения связного набора вещей (импорт, экспорт, обнаружение), а не наличия отдельных объектов стратегии.
Обычный способ организовать несколько реализаций (календарные протоколы в вашем случае) с одним общим интерфейсом - Шаблон моста .