Насмешка последнего метода

Я должен дразнить некоторый класс с последним методом с помощью 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());
    }

Это работает, но "запахи".

Так, Где правильный путь?

Спасибо.

59
задан 25 September 2010 в 16:27

1 ответ

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 сценариев.

5
ответ дан 1 November 2019 в 12:18

Другие вопросы по тегам:

Похожие вопросы: