Могу ли я издеваться над вызовом метода суперкласса? - PullRequest
15 голосов
/ 08 марта 2009

Иногда вы хотите протестировать метод класса и сделать ожидание при вызове метода суперкласса. Я не нашел способ сделать это ожидание в Java с помощью easymock или jmock (и я думаю, что это невозможно).

Существует (относительное) чистое решение - создать делегата с логикой метода суперкласса, а затем установить на него ожидания, но я не знаю, почему и когда использовать это решение. Какие-нибудь идеи / примеры?

Спасибо

Ответы [ 6 ]

12 голосов
/ 08 марта 2009

Ну, вы можете, если хотите. Я не знаю, знакомы ли вы с JMockit , проверьте это. Текущая версия 0.999.17. А пока давайте посмотрим на это ...

Предположим следующую иерархию классов:

public class Bar {
    public void bar() {
        System.out.println("Bar#bar()");
    }
}

public class Foo extends Bar {
    public void bar() {
        super.bar();
        System.out.println("Foo#bar()");
    }
}

Затем, используя JMockit в вашем FooTest.java, вы можете проверить, что вы действительно звоните на Bar с Foo.

@MockClass(realClass = Bar.class)
public static class MockBar {
    private boolean barCalled = false;

    @Mock
    public void bar() {
        this.barCalled = true;
        System.out.println("mocked bar");
    }
}

@Test
public void barShouldCallSuperBar() {
    MockBar mockBar = new MockBar();
    Mockit.setUpMock(Bar.class, mockBar);

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);

    Mockit.tearDownMocks();
}
5 голосов
/ 28 марта 2016

Расширение ответа @Cem Catikkas с использованием JMockit 1.22:

@Test
public void barShouldCallSuperBar() {
    new MockUp<Bar>() {
        @Mock
        public void bar() {
            barCalled = true;
            System.out.println("mocked bar");
        }
    };

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);
}

Нет необходимости в статическом классе, аннотированном @MockClass, он заменяется классом MockUp.

4 голосов
/ 08 марта 2009

Не думаю, что я высмеиваю супер-вызов - мне кажется, что поведение - это часть поведения самого класса, а не поведение зависимости. Насмешка всегда кажется, что она должна быть связана с зависимостями больше всего на свете.

У вас есть хороший пример вызова, который вы хотите издать? Если вы хотите смоделировать вызов, подобный этому, стоит ли рассматривать композицию вместо наследования?

1 голос
/ 05 марта 2012

Нет, нет способа высмеять методы суперкласса с помощью jMock .

Однако есть быстрое и грязное решение вашей проблемы. Предположим, у вас есть класс A и класс B расширяет A. Вы хотите смоделировать метод Aa () на B. Вы можете ввести класс C расширяет B в свой тестовый код и переопределить метод Ca () (просто вызвать super или вернуть null, id не имеет значения). После этого макет C и используйте макет везде, где вы будете использовать B.

1 голос
/ 22 июня 2009

Существует несколько тестов, которые делают именно это (то есть указывают ожидаемый вызов для метода суперкласса) с использованием API ожиданий JMockit, в наборе тестовых наборов Animated Transitions. Например, FadeInTest контрольный пример.

0 голосов
/ 21 мая 2009

перехват супер звонка слишком мелкий. Не переусердствуйте с изоляцией.

...