Хорошая практика диктует, что переменные должны быть объявлены как локальные, насколько это возможно. Это, однако, мешает хорошей практике инъекции зависимостей для модульного тестирования.Хорошая практика: Сохранение локальной переменной видимости 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
, даже если я использую его только локально в этом методе.
Есть ли способ обойти это или я вынужден сделать это поле класса?
Благодаря
Хм, так вы говорите, что я должен ввести «Карта» в поле предыдущего класса (тот, который вызывает этот метод «start()»), а затем передавать его как параметр каждый раз, когда ' Вызывается метод start() '? – Tiberiu
@Tiberiu Если он отличается между вызовами 'start()', да (или передать какой-то «VirtualMachineProvider», который вы можете издеваться). Если вы только 'start()' один раз, то вы, вероятно, должны передать карту в конструктор класса. – chrylis