Статьи

Java: фальсификация замыкания с фабрикой для создания объекта домена

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

Первоначально мы только что создали новую зависимость внутри класса домена, но это делает невозможным контроль ее значения в тесте.

Точно так же не казалось, что мы должны передавать эту зависимость в конструктор объекта домена, поскольку это не часть состояния, которая определяет объект, а просто то, что он использует.

В итоге мы получили нечто похожее на следующий код, где у нас есть объект предметной области как внутренний класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class FooFactory {
    private final RandomService randomService;
  
    public FooFactory(RandomService randomService) {
        this.randomService = randomService;
    }
  
    public Foo createFoo(String bar, int baz) {
        return new Foo(bar, baz);
    }
  
    class Foo {
        private String bar;
        private int baz;
  
        public Foo(String bar, int baz) {
            this.bar = bar;
            this.baz = baz;
        }
  
        public int awesomeStuff() {
            int random = randomService.random(bar, baz);
            return random * 3;
        }
    }
}

Тест на этот код может выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
public class FooFactoryTest {
    @Test
    public void createsAFoo() {
        RandomService randomService = mock(RandomService.class);
        when(randomService.random("bar", 12)).thenReturn(13);
  
        FooFactory.Foo foo = new FooFactory(randomService).createFoo("bar", 12);
        assertThat(foo.awesomeStuff(), equalTo(39));
    }
}

Это немного многословный способ обойти проблему, но, похоже, он работает достаточно хорошо.

Ссылка: Java: фальсификация замыкания с фабрикой для создания объекта домена от нашего партнера JCG