Недавно мы хотели создать объект домена, который должен иметь внешнюю зависимость для выполнения вычислений, и мы хотели иметь возможность устранить эту зависимость в наших тестах.
Первоначально мы только что создали новую зависимость внутри класса домена, но это делает невозможным контроль ее значения в тесте.
Точно так же не казалось, что мы должны передавать эту зависимость в конструктор объекта домена, поскольку это не часть состояния, которая определяет объект, а просто то, что он использует.
В итоге мы получили нечто похожее на следующий код, где у нас есть объект предметной области как внутренний класс:
|
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