Нужна помощь с некоторыми основными проблемами PowerMock / EasyMock - PullRequest
1 голос
/ 12 марта 2011

Я относительно новичок в мире 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();
}
}

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

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

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

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

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

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

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

Спасибо,

Крейг

1 Ответ

3 голосов
/ 12 марта 2011

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

Что-то вроде:

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

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

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

...