Пропустить вызов метода в тестовом примере junit с использованием EasyMock? - PullRequest
0 голосов
/ 09 января 2020

Я пишу контрольный пример для метода headersection (). Внутри этого метода он вызывает конструктор другого класса, скажем, класса «InformationHeader. java». Внутри этого конструктора он вызовет один метод, называемый «makepage ()». Снова метод «makepage ()» вызовет другой метод «createpage ()».

Я хотел пропустить вызов метода «createpage ()» в моем тестовом примере. Пожалуйста, предложите, как достичь этого сценария?

private void headersection(Object child) {
    headerobject = new InformationHeader(parameter_1, parameter_2, parameter_3, parameter_4);
    //lines of code
}


//InformationHeader.java
public InformationHeader(parameter_1, parameter_2, parameter_3, parameter_4) {
    //lines of code
    makepage();
    //lines of code
}

public final void makepage() { 
    //lines of code
    createpage();    //I wanted to skip this method call 
}

Любая помощь будет оценена

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Ответ с использованием шпионов не работает. new InformationHeader(/*parameter*/) вызовет createpage. У вас будет та же проблема с EasyMock.

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

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

При сохранении текущего дизайна, проще всего на самом деле сделать ручной макет. Это так.

public class MyTest extends EasyMockSupport {

    @Test
    public void test() {
        InformationHeader header = new InformationHeader("a", "b", "c", "d") {
            @Override
            public void createpage() {
                // do nothing
            }
        };
        ToTest toTest = partialMockBuilder(ToTest.class)
                .withConstructor()
                .addMockedMethod("createHeader")
                .mock();
        expect(toTest.createHeader()).andReturn(header);

        replayAll();

        toTest.headersection(null);
    }
}

class ToTest {
    void headersection(Object child) {
        InformationHeader headerobject = createHeader();
    }

    InformationHeader createHeader() {
        return new InformationHeader("a", "b", "c", "d");
    }
}

class InformationHeader {

    public InformationHeader(String p1, String p2, String p3, String p4) {
        makepage();
    }

    public final void makepage() {
        createpage();
    }

    public void createpage() {
        throw new RuntimeException("Should not be called");
    }
}
0 голосов
/ 10 января 2020

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

void headersection(Object child) {
    headerobject = getInformationHeader(/*parameter*/)
    //lines of code
}

InformationHeader getInformationHeader(/*parameter*/) {
    return new InformationHeader(parameter_1,parameter_2,parameter_3,parameter_4);
}

Я не знаю ваш класс имя, в котором хранится метод заголовка, скажем, SectionService. Теперь вы можете использовать Mockito для создания так называемого шпиона

@InjectMock
SectionService serviceToTest; 
SectionService spyServiceToTest = Mockito.spy(serviceToTest);
InformationHeader spyInformationHeader = Mockit.spy(new InformationHeader(/*parameter*/));

Теперь вы можете смоделировать вызов внутри тестируемого класса:

Mockito.doReturn(spyInformationHeader).when(spyServiceToTest).getInformationHeader(//parameter);
Mockiot.doNothing().when(spyInformationHeader).createpage(); 

Здесь is вопрос stackoverflow, который касается шпионских вызовов и , вот документация Mockito.

Надеюсь, это поможет, привет Матиас

...