У меня есть класс с методом переадресации foo
:Testing конкретный класс третьей стороной с JMock
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
?
Редактировать:
Да, бар окончательный.
Мое решение, которое является не общим, было использование класса «Тестер» в сторонней библиотеке для правильной настройки Concrete
.
Не могли бы вы немного расширить этот ответ? Я не заметил, потому что вижу, что вы по-прежнему активным пользователем, и это старый ответ, но было бы полезно объяснить еще несколько объяснений. – Pops