首页 > 解决方案 > 递归函数的 JUnit 测试(创建文件并比较大小)

问题描述

我正在做一个项目:复制一个文件并检查大小是否相等。如果没有,删除文件并重做(定义重试次数)

public boolean copieFichierAvecRetry(FileObject copieFichierFile, FileObject fichierACopier, int nbRetry, int currentNbRetry)
        throws InterruptedException, IOException {
    logger.logInfo("Deplacement du fichier " + fichierACopier.getName().getBaseName(),
            "de " + fichierACopier.getParent().getName().getPath() + " vers "
                    + copieFichierFile.getParent().getName().getPath());
    copieFichierFile.copyFrom(fichierACopier, Selectors.SELECT_SELF);
    boolean tailleOk = false;
    // Si le flag de vérification est à true on vérifie que les fichiers
    // copies ont la même taille
    try {
        tailleOk = verificationTailleCorrespondantes(copieFichierFile, fichierACopier);
        if (!tailleOk && currentNbRetry <= nbRetry){
            logger.logInfo("Erreur lors de la verification de la taille, essai n°" + currentNbRetry, null);
            copieFichierFile.delete();
            currentNbRetry++;
            copieFichierAvecRetry(copieFichierFile, fichierACopier, nbRetry, currentNbRetry);
        }
    } catch (IOException e) {
        logger.logWarn("Erreur lors de la verification de la taille : ", e.getMessage());
        tailleOk = false;
    }
    return tailleOk;
}

这是非递归函数的单元测试:

public void testCopieFichier()
        throws IOException, InterruptedException, URISyntaxException, TransfertFichierException {
    socleUtil.setNbTentativeMaxTransfert(1);
    String nomFichierSource = "test123.txt";
    String nomFichierDestination = "testDownloadSuccess.xml";

    File fileOrigine = new File(getClass().getResource(SocleConstantes.SLASH).getFile());
    String cheminFichierDistantOrigine = fileOrigine.getPath();
    File fileDestination = new File(getClass().getResource(SocleConstantes.SLASH).toURI());
    String cheminFichierDistantDestination = fileDestination.getPath() + FILE_SEPARATOR + "download";

    assertTrue(socleUtil.copieFichier(
            socleUtil.findFileLocal(cheminFichierDistantDestination + "/" + nomFichierDestination),
            socleUtil.findFileLocal(cheminFichierDistantOrigine + "/" + nomFichierSource)));
    assertTrue(fileDestination.exists());
}

正如您在上面的代码中看到的,它将复制一个文件,检查大小,如果没问题,则返回 true。如果 5 次为假(在示例中),则该函数在删除大小错误的文件后调用自身。

如果它复制文件并且永远不会失败(在生产中发生),我应该如何测试这个函数的递归性?

谢谢

标签: javaunit-testingjunit

解决方案


在这种情况下,我会编写以下场景:

  • 流程在第一次迭代时成功
  • 该过程在第 (n-1) 次迭代时失败,在第 n 次迭代时成功,且 n < 重试次数
  • 该过程在第 n 次迭代时失败,n == 重试次数

为了做到这一点,您需要模拟您的依赖项。特别是检查文件大小的那个。对前面场景的嘲笑是

  • 文件大小检查返回 true。断言检查已运行一次且结果有效
  • 文件大小检查返回 false (n-1) 次,第 n 次返回 true。断言检查已运行 n 次且结果有效
  • 文件大小检查返回 false。断言检查已运行重试次数且结果无效

推荐阅读