Издевательство над текущим временем с помощью JRE 1.4

В настоящее время я ограничен только использованием JRE 1.4 (среда выполнения Java), и у меня есть класс, в котором есть некоторые расчеты текущего времени. Я пытаюсь выполнить модульное тестирование класса, но это кажется довольно сложным, поскольку все инструменты для насмешек, с которыми я сталкивался, требуют аннотаций, которые не поддерживаются JRE1.4.

Я пытался использовать версию mockito для JRE 1.4, но это не позволяет мне издеваться над статическими классами. У Jmockit есть очень простое решение, которое можно загрузить, НО, похоже, нет версии Jmockit, поддерживающей JRE1.4.

Есть два способа обойти это, если бы я использовал JRE 1.5 и выше (смоделировать метод, который вызывает текущее время, или просто смоделировать текущее системное время), но, к сожалению, это не так.

Единственное решение для этого — просто передать текущее системное время в методы с +/- днем/месяцем/годом.

Однако я хотел бы сделать это издевательским способом, если это возможно, в среде JRE 1.4.

Спасибо


person yoshi594    schedule 10.03.2011    source источник


Ответы (5)


Почему бы просто не использовать Java 5 только для тестового кода? В приличной IDE у вас должна быть возможность иметь отдельные модули/проекты для тестового кода (Java 5+) и производственного кода (Java 1.4).

person Rogério    schedule 28.08.2011

Помимо решения Zsolt (создание оболочки), другим возможным решением является извлечение вызова метода и последующее тестирование подкласса, который переопределяет этот метод.

Код для тестирования:

class A{
    protected long now(){
        return System.currentTimeMillis();
    }
}

Модульный тест:

class ATest{
    public void testStuff(){
        // actual test
    }

    class MyA extends A {
        long currentTime;

        protected long now(){
            return currentTime;
        }
    }
}

Я предпочитаю подход с оболочкой, но в некоторых случаях может быть полезно создание подклассов.

person JoaoHornburg    schedule 23.08.2011
comment
@ yoshi594 Я прочитал комментарии к ответу Жолта после того, как написал свой. Поскольку вы не можете изменить код, это решение также не работает. Извини. - person JoaoHornburg; 24.08.2011

Я предлагаю использовать обертку, когда вы имеете дело со статическими методами. Например, в вашем случае вы можете использовать TimeWrapper:

public class TimeWrapper() {
    public long getCurrentTimeInMillis() {
        return System.currentTimeMillis();
    }
}

Введите TimeWrapper, когда вы должны получить текущее время в других ваших классах. Это решение не зависит от фиктивных фреймворков и jdks.

person Zsolt    schedule 10.03.2011
comment
Ну, я забыл упомянуть, что я просто тестирую класс и не меняю код внутри. То, что я пытался сделать раньше, было подклассом метода, который вызывает текущее время и вводит его при необходимости, но он по-прежнему вызывает исходный метод. - person yoshi594; 10.03.2011
comment
Я понимаю. Если вы не можете изменить код, воспользуйтесь решением @UWe и попробуйте easymock. С другой стороны, неразумно смешивать имитирующие фреймворки (одна из причин заключается в том, что они могут использовать разные JUnitRunners, что затруднит чтение и поддержку вашего тестового кода), поэтому, если вы решите использовать easymock, вам, возможно, придется преобразовать свой старые тест-кейсы. - person Zsolt; 10.03.2011
comment
Да, я постараюсь использовать легкий макет. дам вам знать, если я успешен или нет =) - person yoshi594; 11.03.2011

easymock не требует аннотаций, поэтому он будет работать с версией 1.4.

person Uwe    schedule 10.03.2011

Или используйте специальный класс для всех методов, связанных со временем, например DateHelper. Затем вы можете смоделировать это в своих UnitTests и изменить время с помощью статической переменной.

person Tobias    schedule 10.03.2011