Нужна помощь с некоторыми основными проблемами PowerMock/EasyMock

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

Рассмотрим эти два класса:

public class Foo
{
    public int doStuff(int a)
    {
        return (5 / a);
    }
}

public class Bar
{
    public void doSomething()
    {
        Foo foo = new Foo();
        int c = foo.doStuff(0);
    }
}

Теперь в тестовом классе я хочу протестировать метод Bar doSomething. У меня проблема в том, что он использует Foo. Как видите, передача 0 в Foo приведет к ошибке деления на ноль. Я хотел бы заглушить/подавить Foo.doStuff(), чтобы этого не произошло. Все, что мне действительно нужно сделать, это убедиться, что doStuff() действительно вызывается. Итак, я сделал это:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Foo.class })                 

public class TestStuff
{

@Test
public void testOtherStuff() throws Exception
{

    Foo fooMock = PowerMock.createMock(Foo.class);
    expectNew(Foo.class).andReturn(fooMock);
    EasyMock.expect(fooMock.doStuff(anyInt())).andReturn(1);
    //fooMock.doStuff(anyInt());

    //suppress (method(Foo.class, "doStuff"));

    replayAll();

    Bar bar = new Bar();
    bar.doSomething();

    verifyAll();
}
}

Когда я запускаю это, я получаю исключение деления на ноль. Я думал, что использование вызова expect() и указание возвращаемого значения 1 предотвратит выполнение метода. Это явно не так. Итак, первый вопрос, почему бы и нет?

Итак, я попытался сделать утверждения, которые прокомментированы выше. То есть я закомментировал вызов expect() и использовал два других оператора, думая, что должен подавить выполнение метода. Я обнаружил, что если бы я не выполнял оператор submit(), я всегда получал бы исключение деления на ноль. Однако, имея там оператор подавления, я получаю ошибку утверждения, где говорится, что ожидалось, что doStuff будет вызван 1 раз, а фактических вызовов было 0.

Итак, почему метод не считается выполненным?

Как мне заставить фиктивные вещи «заглушить» метод, чтобы он считался выполненным, на самом деле ничего не делая?

Ситуация, с которой я столкнулся, на самом деле имеет недействительный возврат на doStuff. Чем отличаются необходимые фиктивные операторы для обработки методов без возвращаемого значения по сравнению с теми, которые возвращают?

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

Любая помощь?

Спасибо,

Крейг


person Craig Anderson    schedule 11.03.2011    source источник


Ответы (1)


Посмотрите на это из документов PowerMock: http://code.google.com/p/powermock/wiki/MockConstructor

Что-то типа:

Foo fooMock = createMock(Foo.class);
expectNew(Foo.class, 0).andReturn(fooMock);

Редактировать: Добавление действительно важной части документов (которую Крейг нашел самостоятельно):

Используйте аннотацию @PrepareForTest(ClassThatCreatesTheNewInstance.class) на уровне класса тестового примера.

person Community    schedule 11.03.2011
comment
метод testOtherStuff уже содержит описанные вами вызовы createMock и expectNew. - person krock; 12.03.2011
comment
Ух ты. Это действительно сработало, когда я изменил PrepareForTest, чтобы использовать класс Bar вместо класса Foo. Видимо, я готовил не тот класс. Удивительный. Большое спасибо! - person Craig Anderson; 12.03.2011
comment
@krock, очень верно. Плохой я. Я обновил решение, которое Крейг нашел самостоятельно, так что оно здесь. - person Michael Brewer-Davis; 12.03.2011