У меня есть класс с методом переадресации foo
:
void foo( Concrete c, String s ) { c.bar( s ); }
Я хочу проверить, действительно ли foo
вперед. К сожалению для меня, Concrete
- это класс в сторонней библиотеке, и это конкретный тип, а не интерфейс. Таким образом, я должен использовать ClassImposteriser
в JMock для макета Concrete
, поэтому в моем тестовом примере я делаю это:
@Test
public final void testFoo() {
Mockery context = new JUnit4Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
final Concrete c = context.mock(Concrete.class);
final String s = "xxx" ;
// expectations
context.checking(new Expectations() {{
oneOf (c).bar(s); // exception gets thrown from here
}});
new ClassUnderTest.foo( c, s );
context.assertIsSatisfied();
}
К сожалению, Concrete.bar
в свою очередь вызывает метод, который выбрасывает. Этот метод является окончательным, поэтому я не могу переопределить его. Кроме того, даже если я закомментирую строку new ClassUnderTest.foo( c, s );
, исключение выдается, когда JMock устанавливает исключения, а не когда вызывается foo
.
Так, как я могу проверить, что метод ClassUnderTest.foo
перенаправляет на Concrete.bar
?
Edit:
Да, бар является окончательным.
Мое решение, которое не является общим, заключалось в использовании класса "Tester" в сторонней библиотеке для правильной настройки Concrete
.