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