Допустим, у нас есть интерфейс, который имеет два метода:
public interface MyInterface {
public SomeType first();
public SomeType second();
}
Этот интерфейс реализован MyInterfaceImpl
. Внутри реализации first()
вызывает second()
для получения некоторых результатов.
Я хочу построить модульный тест, который бы утверждал, что вещи из first()
основаны на том, что выходит из second()
, подобно:
1 public class MyInterfaceTest {
2 private MyInterface impl = new MyInterfaceImpl();
4 @Test
5 public void testFirst() {
6 // modify behaviour of .second()
7 impl.first();
8 assertSomething(...);
10 // modify behaviour of .second()
11 impl.first();
12 assertSomethingElse(...);
13 }
14 }
Существует ли простой способ создать макет в строке 2
, чтобы все вызовы выбранных методов (например, first()
) были бы вызваны напрямую (делегированы MyInterfaceImpl
), тогда как некоторые другие методы (например, * 1017) *) заменены на макетные аналоги?
Это на самом деле очень легко сделать с PowerMock для статических методов, но мне нужно нечто подобное для динамических.
Решения на основе
MyInterface mock = EasyMock.createMock(MyInterface.class);
MyInterface real = new MyInterfaceImpl();
EasyMock.expect(mock.first()).andReturn(real.first()).anyTimes();
EasyMock.expect(mock.second()).andReturn(_somethingCustom_).anyTimes();
не достаточно хороши, особенно для интерфейсов, имеющих много методов (много шаблонов). Мне нужно поведение переадресации, поскольку real
на самом деле зависит от других макетов.
Я ожидаю, что что-то подобное будет обрабатываться фреймворком, а не моим собственным классом. Это достижимо?