2016-08-29 2 views
0

Хорошая практика диктует, что переменные должны быть объявлены как локальные, насколько это возможно. Это, однако, мешает хорошей практике инъекции зависимостей для модульного тестирования.Хорошая практика: Сохранение локальной переменной видимости VS-зависимой инъекции

Пример:

Class A { 

    public A() {} 

    public void start() { 
     Map<Integer, VirtualMachine> vms = VirtualMachine.getAllVMs(); 

     // more code here 
    } 
} 

Теперь я не могу модульное тестирование методы start(). (getAllVMs() оказывается статическим методом в этом случае, но он мог бы так же легко быть объектом new. note: Я не хочу использовать powermock).

Так что я могу использовать google guice, чтобы ввести его, но если я это сделаю, мне нужно дать класс vms, даже если я использую его только локально в этом методе.

Есть ли способ обойти это или я вынужден сделать это поле класса?

Благодаря

ответ

2

Если значение этой переменной требуется только в одном вызове метода, то передать его в качестве параметра метода. Если он применяется во многих независимых вызовах метода, обеспечивая общий контекст, тогда логическая область «больше», чем метод, и она должна быть полем.

+0

Хм, так вы говорите, что я должен ввести «Карта» в поле предыдущего класса (тот, который вызывает этот метод «start()»), а затем передавать его как параметр каждый раз, когда ' Вызывается метод start() '? – Tiberiu

+1

@Tiberiu Если он отличается между вызовами 'start()', да (или передать какой-то «VirtualMachineProvider», который вы можете издеваться). Если вы только 'start()' один раз, то вы, вероятно, должны передать карту в конструктор класса. – chrylis