Могу ли я имитировать вызов метода суперкласса?

StackOverflow https://stackoverflow.com/questions/622763

Вопрос

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

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

Спасибо

Это было полезно?

Решение

Что ж, ты можешь, если захочешь.Я не знаю, знакомы ли вы с 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();
}

Другие советы

Расширяя ответ @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.

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

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

Есть несколько тестов, которые делают именно это (т.Е. Указывают ожидаемый вызов метода суперкласса), используя JMockit Expectations API, в тестовом наборе Animated Transitions sample.Например, в FadeInTest Тест на исчезновение тестовый пример.

Нет, нет никакого способа издеваться над методами суперкласса с дЖмок.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top