Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用EasyMock跳过junit测试用例中的方法调用?_Java_Easymock - Fatal编程技术网

Java 使用EasyMock跳过junit测试用例中的方法调用?

Java 使用EasyMock跳过junit测试用例中的方法调用?,java,easymock,Java,Easymock,我正在为“headersection()”方法编写一个测试用例。在这个方法中,它调用另一个类的构造函数,比如“InformationHeader.java”类。在这个构造函数中,它将调用一个名为“makepage()”的方法。同样,“makepage()”方法将调用另一个“createpage()”方法 我想跳过测试用例中对“createpage()”的方法调用。请建议如何实现此场景 private void headersection(Object child) { headerobj

我正在为“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 
}
任何帮助都将不胜感激


谢谢

我希望我收到了你的问题,但是正如我在评论中提到的,你可以稍微改变一下方法,创建一个可以模仿的方法

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

InformationHeader getInformationHeader(/*parameter*/) {
    return new InformationHeader(parameter_1,parameter_2,parameter_3,parameter_4);
}
我不知道headersection方法存储的类名,比如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(); 
是一个stackoverflow问题,处理间谍电话和


我希望这能有所帮助,马蒂亚斯

使用间谍的答案是行不通的。
newinformationheader(/*参数*/)
将调用
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");
    }
}

这很简单,如果不为测试修改字节码,您就不能。但是,要测试
private
方法似乎有点奇怪。你的测试应该只测试一个类的API(例如,只测试它的公共成员)@Lino说,我们可以使用反射测试私有方法。谢谢你的建议。你可以改变一下你的方法。写一个创建InformationHeader类的方法,这个方法可以被模仿。@Matthias Lauber,谢谢你的建议。您能告诉我如何模拟创建“InformationHeader”类的方法吗。“public InformationHeader”是InformationHeader.java中的构造函数,而不是方法。请分享您的想法。您是想对您的方法进行单元测试,还是更像是一种集成测试?谢谢您的建议。似乎根据你的答案,代码库被修改了。但是我不能重构代码。不过,我会尝试一下你的解决方案。谢谢。如果你真的不能重构任何东西(事实并非如此),PowerMock可以帮助你模拟
新信息头的调用。谢谢你,亨利,但我只能使用“EasyMock”框架。