Предложения для java Mock File (для извлечения java.io.File)
Есть ли у кого-нибудь предложения для объекта java mock File?
Я использую класс третьей стороны, который должен получить объект java.io.File в качестве аргумента.
Я получаю данные для этого файла в потоке через webservice (также один из их продуктов).
Одно из решений - записать все эти данные в файл и предложить это классу. Это решение, которое мне не нравится: оно устраняет преимущество использования web-сервиса вместо простое скачивание файла.
Быстрее и эффективнее было бы поместить эти данные из памяти в файл Mock и предложить этот Mock файл классу thirdparty.
Вероятно, это должен быть MockFile, расширяющий java.io.File и переопределяющий все функции, которые фактически взаимодействуют с файлом на жестком диске.
Я знаю, что третье лицо должно было использовать поток в качестве входного аргумента вместо файла. Однако это выходит за рамки моего влияния.
Ответы
Ответ 1
Это просто предложение, основанное на моем понимании вашего вопроса.
Я считаю, вы должны делать что-то вроде этого,
public void doSomething(){
//Pre processing
Object result=new ThirdPartyCode().actualMethod(file);
//Post processing
}
Макетные объекты имеют больше смысла с точки зрения модульного тестирования.
Ваша цель состоит не в функции unit test функции сторонней библиотеки. В этом случае используется метод unit test doSomething(). Поэтому, возможно, вы можете создать обертку вокруг сторонней функции. Возможно, что-то вроде этого,
public class Wrapper implements MyWrapper{
public Object invokeThirdPartyFunction(File file){
new ThirdPartyCode().actualMethod(file);
}
}
Теперь вы можете создать макетную оболочку (реализующую один и тот же интерфейс) и использовать эту макетную обертку для всех случаев junit.
Ответ 2
Проверяет ли тестируемый класс только запрос имени файла, атрибутов и т.д. или пытается ли он открыть файл?
В первом случае вы можете легко создать свой макет с использованием, например, EasyMock или эквивалентную фальшивую фреймворк.
Последний случай более сложный, и я боюсь, что входной поток создается внутри класса, у вас нет другого выбора, кроме фактического создания реального тестового файла на HD.
Ответ 3
Вы можете загрузить сторонний код, используя загрузчик классов на базе ASM, который отображает java.io.File
в вашу собственную "поддельную" реализацию. Это немного работы, и ее нужно выполнять тщательно... Например, вам также нужно будет отобразить FileInputStream
и т.д.
Ответ 4
Вы не используете файл (или любую внешнюю зависимость в модульных тестах). Кроме использования mocks, ваши подходы приведут к проблемным испытаниям.
См. эту статью javaranch для более