Я должен дразнить некоторый класс с последним методом с помощью mockito. Я имею, записал что-то вроде этого
@Test
public void test() {
B b = mock(B.class);
doReturn("bar called").when(b).bar();
assertEquals("must be \"overrided\"", "bar called", b.bar());
//bla-bla
}
class B {
public final String bar() {
return "fail";
}
}
Но это перестало работать. Я попробовал некоторый "взлом", и он работает.
@Test
public void hackTest() {
class NewB extends B {
public String barForTest() {
return bar();
}
}
NewB b = mock(NewB.class);
doReturn("bar called").when(b).barForTest();
assertEquals("must be \"overrided\"", "bar called", b.barForTest());
}
Это работает, но "запахи".
Так, Где правильный путь?
Спасибо.
Mockito 2.x теперь поддерживает последний метод и заключительный блокирующий класс.
Насмешка заключительных классов и методов является выведением, подпишитесь на функцию. Эта опция должна быть явно активирована путем создания файла
src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
, содержащего одну строку:
mock-maker-inline
после создания этого файла, который можно сделать:
final class FinalClass { final String finalMethod() { return "something"; } } FinalClass concrete = new FinalClass(); FinalClass mock = mock(FinalClass.class); given(mock.finalMethod()).willReturn("not anymore"); assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod());
В последующие этапы, команда принесет программный способ использовать эту функцию. Мы определим и окажем поддержку для всех unmockable сценариев.