Nano Hash - криптовалюты, майнинг, программирование

Проблема с имитацией методов PowerMock и EasyMock

Я новичок в EasyMock и PowerMock, и я застрял, вероятно, в чем-то очень простом.

Ниже приведен мой код, который я хотел бы протестировать.

import java.io.File;

public class FileOp() {
private static FileOp instance = null;
public string hostIp = "";

public static FileOp() {
    if(null == instance)
        instance = new FileOp();
}

private FileOp() {
    init();
}

init() {
    hostIp = "xxx.xxx.xxx.xxx";
}

public boolean deleteFile(String fileName) {
    File file = new File(fileName);
    if(file.exists()) {
        if(file.delete())
            return true;
        else
            return false;
    }
    else {
        return false;
    }
}

}

Ниже приведен мой тестовый код...

    import org.easymock.EasyMock;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.easymock.PowerMock;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    import org.powermock.reflect.Whitebox;

    import java.io.File;

    import static org.easymock.EasyMock.expect;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(FileOp.class)
    public class FileOp_JTest
    {

@Test
@PrepareForTest(File.class)
public void deleteFile_Success(){
    try {
        final String path = "samplePath";

        //Prepare
        File fileMock = EasyMock.createMock(File.class);

        //Setup
        PowerMock.expectNew(File.class, path).andReturn(fileMock);
        expect(fileMock.exists()).andReturn(true);
        expect(fileMock.delete()).andReturn(true);

        PowerMock.replayAll(fileMock);

        //Act
        FileOp fileOp = Whitebox.invokeConstructor(FileOp.class);
        assertTrue(fileOp.deleteFile(path));

        //Verify
        PowerMock.verifyAll();
    }
    catch (Exception e) {
        e.printStackTrace();
        assertFalse(true);
    }
}

}

Тест не пройден из-за assertTrue(fileOp.deleteFile(path));

Я проследил его до deleteFile("samplePath"), когда вызывается пытается сделать file.exists() и возвращает false. Однако я издевался над file.exists(), чтобы вернуть true.


  • Я смог решить проблему. Тест прошел, как только я поместил классы File и FileOp на уровень класса для PrepareForTest. Я также увидел, что если я удалю @PrepareForTest с уровня класса и поставлю @PrepareForTest({File.class, FileOp.class}), тесты пройдут. Как вы можете видеть здесь, я поместил один @PrepareForTest(File.class) на уровень класса и PrepareForTest(FileOp.class) на уровень метода. Почему это происходит? 30.03.2012

Ответы:


1

Файл, который вы используете в своем тесте, не издевается. У вас есть файлMock, но он не используется в вашем тесте. Метод, который вы тестируете, создает собственный новый объект File в следующей строке:

File file = new File(fileName);

Если ваш метод deleteFile будет принимать объект File вместо String, вы можете ввести туда свой mockObject и проверить, все ли вызовы верны.

29.03.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..