переопределить содержимое метода void

Я использую EasyMock 3+.

Я тестирую метод, например. processMessage(), который (подошел бы) моим тестам, но в самом конце метода этот метод также вызывает другой метод dispatchMessage(String msg) того же класса. Этот последний метод принимает объект, внедренный @EJB, который меня действительно не волнует в этом тесте. Конечно, этот объект приводит к исключению NullPointerException.

Как я могу издеваться над этим методом с помощью Easymock, чтобы просто игнорировать его код и возвращать void. то есть

void dispatchMessage(String msg){
     return;
}

Благодарность


person feder    schedule 22.06.2015    source источник


Ответы (4)


Вы можете использовать функцию частичного макета EasyMock.

Предположим, что следующий класс:

public class ClassUnderTest {

    @EJB
    private SomeEJB someEJB;

    public void processMessage() {
        dispatchMessage("some message");
    }

    public void dispatchMessage(String msg) {
        someEJB.dispatch(msg);        
    }
}

Чтобы протестировать только метод processMessage, вы можете издеваться над dispatchMessage:

import org.easymock.EasyMockSupport;
import org.junit.Test;

public class ProcessMessageTest extends EasyMockSupport {

    @Test
    public void processMessage() throws Exception {
        ClassUnderTest classUnderTest = createMockBuilder(ClassUnderTest.class)
            .addMockedMethod("dispatchMessage")
            .createMock();  
        classUnderTest.dispatchMessage("some message");
        replayAll();

        classUnderTest.processMessage();

        verifyAll();
    }

}
person eee    schedule 22.06.2015
comment
Я не могу статически вызывать метод createMockBuilder. Это не решает метод. Какую библиотеку и версию библиотеки вы используете? импорт? - person feder; 20.07.2015
comment
В этом примере использовался EasyMock 3.3.1. Я добавил в ответ полный тестовый класс с импортом. Кроме того, в примере теперь используются verifyAll и replayAll (также встречаются в EasyMockSupport). - person eee; 20.07.2015

Другой альтернативой является использование платформы PowerMock, которая очень хорошо работает с EasyMock и имеет некоторые дополнительные функции, которые могут вас заинтересовать (например, имитация создания новых объектов или вызовы статических методов): https://code.google.com/p/powermock/wiki/MockPrivate

person nutfox    schedule 17.07.2015

для имитации метода void полезен метод expectLastCall(), и в этом случае вам не нужно ничего возвращать, поскольку тип возвращаемого значения - void

по сути нужно сделать

mockObject.dispatchMessage(Easymock.anyObject(String.class));
Easymock.expectLastcall();

Надеюсь, поможет!

удачи!

person Vihar    schedule 22.06.2015

Нет необходимости вызывать replay или verify. Я сделал это так. Добавлена ​​аннотация @BeforeClass.

InboundMDB inboundMock;

@BeforeClass
public void beforeClass() {
    inboundMock = new InboundMDB();
}

Затем создал экземпляр построителя EasyMock и добавил метод, который меня НЕ интересует.

IMockBuilder<InboundMDB> iMockBuilder = EasyMock
                .createMockBuilder(InboundMDB.class);
        inboundMock = iMockBuilder.addMockedMethod("dispatch")
                .createMock();

Следуя этому коду, который вызывает тестируемый метод (исходная цель)...

try {
        inboundMock.processMessage(aMessage);
    } catch (Exception e) {
        Assert.fail(e.getMessage());
    }

Конечно, если я опускаю частичный макет, он генерирует исключение нулевого указателя, как описано изначально. Теперь так больше не делают. Все хорошо.

person feder    schedule 20.07.2015
comment
Я рекомендую использовать replay и verify, чтобы фиктивный метод вызывался должным образом. Кроме того, я думаю, что метод beforeClass не нужен, так как вы все равно перезапишете inboundMock позже. - person eee; 20.07.2015