Java 如何模拟测试中的故障

Java 如何模拟测试中的故障,java,mocking,Java,Mocking,我正在为web服务API编写一个适配器。适配器将文件与web服务同步。我想测试的一件事是,如果适配器同步时一次同步失败,下一次同步仍然可以拾取所有正确的文件 我的问题是,如何在与真正的web服务交互时模拟故障?例如,如果web服务API包含: class WebService { List<String> getFileNamesToSync() { ...... } File getFile(String name) throws SomeE

我正在为web服务API编写一个适配器。适配器将文件与web服务同步。我想测试的一件事是,如果适配器同步时一次同步失败,下一次同步仍然可以拾取所有正确的文件

我的问题是,如何在与真正的web服务交互时模拟故障?例如,如果web服务API包含:

class WebService {
    List<String> getFileNamesToSync() {
       ......
    }

    File getFile(String name) throws SomeException {
        <talks to the web service API>;
    }
}
类Web服务{
列出getFileNamesToSync(){
......
}
File getFile(字符串名称)引发一些异常{
;
}
}
和我的适配器类:

class MyAdapter {
    void MyFunction() {
        List<String> names = webService.getFileNamesToSync();
        for(String n : names) {
            File file = webService.getFile(n);
            .......
        }
    }
}
类MyAdapter{
void MyFunction(){
列表名称=webService.getFileNamesToSync();
for(字符串n:名称){
File File=webService.getFile(n);
.......
}
}
}
如何模拟对getFile的第三次调用因异常而失败


我知道我可以通过模拟来实现这一点,但我仍然希望对getFile的其余调用能够从web服务返回真实数据?这是我可以通过模拟实现的吗?或者我必须编写自己的模拟类?

如果您使用Mockito,您可以创建一个
Answer
类,该类保留一个调用计数器,在大多数调用中调用真正的类,但当计数器达到您的魔数时,您会抛出异常。

如果您使用Mockito,您可以创建一个
Answer
类,该类保留一个调用计数器,在大多数调用中调用真正的类,但当计数器达到您的神奇数字时,您会抛出异常。

您也可以实现这一点。这可能不是您想要的,但您始终可以使用计数器在for循环中手动引发异常,并在计数器=3时引发异常(例如)。您是否可以向其发送一个无效请求,以强制生成故障(如不存在的文件)以获取FileNotFoundException。JUnit是实时模拟流程的最佳方法。但是您需要编写JUnit测试代码。您也可以使用JUnit实现此功能。这可能不是您想要的,但您可以始终在for循环中使用计数器手动引发异常,如果计数器==3,则引发异常(例如)。您是否可以向其发送一个无效请求,以强制生成失败生成(如不存在的文件)以获取FileNotFoundException。JUnit是实时模拟流程的最佳方法。但是您需要编写JUnit测试代码。