递归函数的 JUnit 测试(创建文件并比较大小)

JUnit test on recursive function (creating file and compare size)

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

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());
}

如您在上面的代码中所见,它将复制一个文件,检查大小,如果没问题,则 return 为真。 如果它为 false 5 次(在示例中),则该函数会在删除大小错误的文件后调用自身。

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

谢谢

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

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

为此,您需要模拟您的依赖项。特别是检查文件大小的那个。前面场景的模拟是

  • 文件大小检查 returns 正确。断言检查运行一次,结果有效
  • 文件大小检查 returns 次错误 (n-1) 次,第 n 次正确。断言校验运行n次,结果有效
  • 文件大小检查 returns 错误。断言检查是运行次重试次数结果无效