首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中模拟函数接口调用

在java中模拟函数接口调用
EN

Stack Overflow用户
提问于 2016-05-06 13:37:09
回答 1查看 2.5K关注 0票数 1

我有一个调用函数接口(Java 8)的方法实现,我正在尝试为它编写一个单元测试。下面是我想测试的方法:

代码语言:javascript
复制
// Impl
public Optional<ExternalRelease> getStagedRelease(AccessParams accessParams) throws DigitalIngestionException {
    String resourcesPath=getReleaseResourcesPath(accessParams).orElseThrow(() -> new ValidationException(WRONG_ACCESS_CONTEXT_EXCEPTION));
    String ddexFilePath=getReleaseDdexPath(accessParams).get();
    if( stageDataManager.directoryExists(resourcesPath) ) {
        List<Track> tracks = getTracks(accessParams).
                             orElse(new ArrayList<>());
        ExternalRelease externalRelease = null;
        //Verify if lite XML already exists
        if( stageDataManager.fileExists(ddexFilePath) ) {
            //Load externalRelease values
            String liteDdex = stageDataManager.loadFileContent(ddexFilePath).
                              orElseThrow(() -> new ProcessException("Lite DDEX content couldn't be read."));
            externalRelease = ddexManagerExecutor( (ddexManager) -> ddexManager.getExternalReleaseFromLiteDdex(liteDdex) ).
                              orElseThrow(() -> new ProcessException("External release couldn't be parsed from Lite DDEX."));
            externalRelease.setTracks(tracks);
            return Optional.ofNullable(externalRelease);
        } else {
            //Create lite ddex if it doesn't exist
            ExternalRelease releaseFromTracks=getReleaseFromTracks(tracks);
            String liteDdex = ddexManagerExecutor( (ddexManager) -> ddexManager.getLiteDdexFromAccessParamsAndExternalRelease(accessParams, releaseFromTracks)).
                              orElseThrow(() -> new ProcessException("Lite DDEX content couldn't be generated."));
            stageDataManager.writeStringInFile(ddexFilePath, liteDdex);
            return Optional.ofNullable(releaseFromTracks);
        }
    } else {
        return Optional.empty();
    }
}

请注意第二行,如果

代码语言:javascript
复制
 externalRelease = ddexManagerExecutor( (ddexManager) -> ddexManager.getExternalReleaseFromLiteDdex(liteDdex) ).orElseThrow(() -> new ProcessException("External release couldn't be parsed from Lite DDEX."));`

ddexManagerExecutor是一个使用java 8特性的功能接口:

代码语言:javascript
复制
public interface ddexManagerConsumer<R> {
    R process(DdexManager ddexManager) throws ProcessException;
}

private <R> R ddexManagerExecutor(ddexManagerConsumer<R> action) throws ProcessException {
    DdexManager ddexManager = null;
    try {
        ddexManager = (DdexManager) ddexManagerPool.getTarget();
        return action.process(ddexManager);
    } catch (Exception e) {
        throw new ProcessException("Error while accessing to ddexManager pool.");
    } finally {
        try {
            ddexManagerPool.releaseTarget(ddexManager);
        } catch (Exception e) {
            log.error("Error while releasing ddexManager instance.", e);
        }
    }
}

所以在我的单元测试中,我试着做以下工作,

代码语言:javascript
复制
@Test
public void getStagedReleaseTest_whenFileDoesNoExist() throws Exception{
    AccessParams accessParams = getDefaultAccessParams();
    File file = new File("src/test/resources/testTrack.mp3");
    String xml="<xml/>";
    accessParams.setFileName("testTrack.mp3");
    accessParams.setReleaseSlug("test-release-slug");
    Optional<List<File>> mockFileList = Optional.of(Arrays.asList(file));

    when(mockedStageDataManager.directoryExists(any())).thenReturn(true);
    when(mockedStageDataManager.getResources(anyString(), any())).thenReturn(mockFileList);
    when(mockedStageDataManager.fileExists(anyString())).thenReturn(false);
    when(mockedStageDataManager.loadFileContent(anyString())).thenReturn(Optional.of(xml));
    when(mockedDdexManager.getLiteDdexFromAccessParamsAndExternalRelease(any(), any())).thenReturn(Optional.of(xml));

    DigitalIngestionServiceImpl serviceSpy = spy(service);

    Optional<ExternalRelease> externalRelease = serviceSpy.getStagedRelease(accessParams);
    Assert.assertNotNull(externalRelease);


}

这破坏了我的单元测试,因为我不是在嘲笑对私有函数接口的调用。我只是简单地解释了嘲笑以下内线的原因:

代码语言:javascript
复制
ddexManager.getExternalReleaseFromLiteDdex(liteDdex)

但是,对于调用上述方法的函数接口调用,则没有。知道怎么做到这点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-06 18:01:30

您可以模拟ddexManagerPool.getTarget(),以返回一个模拟的DdexManager,在调用getExternalReleaseFromLiteDdex时返回所需的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37073842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档