Как издеваться над статической переменной в java с помощью JMock

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

Этот класс НЕ вышел из Bean Factory, и я не могу изменить этот факт.

static ApplicationContext applicationContext = ...;

Это отлично работает, но трудно JMock, или, по крайней мере, я не знаю способа, и пока я не смогу, Spring Ctx хочет запуститься. Не идеально подходит для ситуации модульного тестирования.

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

Спасибо.


person JARC    schedule 08.09.2009    source источник


Ответы (3)


Решил это сам.

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

public class ApplicationContextHolder implements ApplicationContextHoldable {

    protected static ApplicationContext applicationContext = ...;

    @Override
    public ApplicationContext getApplicationContext() {
        return ApplicationContextHolder.applicationContext;
    }

}
person JARC    schedule 08.09.2009

Хороший. Ирония в том, что единственное, в чем Spring хорош, — это управление синглтонами, поэтому статические переменные не нужны :)

person Steve Freeman    schedule 22.01.2010
comment
Верно, но в реальном мире у вас не всегда есть этот вариант :) - person JARC; 23.01.2010

Вы можете использовать API-интерфейсы JMock на основе отражения для установки частных/статических полей.

    import static mockit.Deencapsulation.setField;
    //Test method
    public void testSample {
        setField(Sample.class,"isPrivate",true);
        setField(Sample.class,"isStatic",true);
    }

    private class Sample {
        private boolean isPrivate = false;
        private boolean isStatic = false;

    }
person Nitish    schedule 08.08.2013