2015-08-11 3 views
3

Как я могу издеваться над любыми объектами класса.Макет любых объектов класса

Я хочу, чтобы для любого файлового объекта возвращался true, когда на него вызывается exists().

Что-то вроде:

Mockito.mock(File.class) 
//return true for any object of File that calls exist() 
File file = new File("thisDoesntExist"); 
assertEquals(true, file.exists()); 

Как это можно сделать?

Это метод испытуемого (вырублено)

@Override 
public void load(InputArchive archive, int idx) 
{ 
    archive.beginNode("Files", idx); 

    File file = new File(archive.load("Path")); 
    if(file.exists()) 
    { 
     //if it gets here it'll pass the test 
    } 
} 

Я думаю, что выше будет решить мою проблему, но в случае, если есть лучший/альтернативный способ решить мою проблему, я вам скажу, почему Я пытаюсь сделать это:

Причина, по которой я хочу сделать это, это то, что я читаю XML, который создаст файл, основанный на теге, затем проверит этот файлObjectCreatedFromXML, чтобы узнать, существует ли он и если он делает, тогда он будет делать некоторые другие вещи, которые мне нужны для этого.

+0

Вы можете вставлять файл в любом месте; т. е. можете ли вы передать его в качестве параметра? Это облегчило бы это. – Makoto

+0

@Makoto нет, файл создан из XML, но я могу изменить содержимое XML, облегчает ли это? – Aequitas

+0

Не могли бы вы поделиться методом тестирования? Трудно давать предложения с такой небольшой информацией. Однако, если вы не можете изменить код создания файла, чтобы вы могли, например, введите фабрику, которая будет использоваться для создания файла (и может быть изделена в вашем тесте, чтобы вернуть «Файл», который всегда возвращает «истина» из 'exist'), этого не может быть сделано. –

ответ

2

Возможно высмеять ваш объект File, даже если он создан внутри вашего класса, и у вас нет возможности его ввести или ссылаться на него. У меня была эта проблема несколько недель назад, и PowerMock может вам помочь.

Вы должны аннотировать свой тестовый класс для работы с PowerMockRunner. См. Следующий пример:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClassThatWillBeTested.class) 
public class MyUnitTest{ 
    private File mockedFile = mock(File.class); 

    @Before 
    public void setUp() throws Exception { 
     PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(mockedFile); 
    } 
} 

@Test 
public void myTestMethod(){ 
    //test your method here... 
} 

Если вы создаете только один объект, это должно хорошо работать для вас. Также вы можете манипулировать своим макетным объектом, чтобы вернуть то, что хотите.

when(mockedFile.exists()).thenReturn(true); 
+0

+1, потому что он отвечает на вопрос, но, к сожалению, мне не помогает, поскольку я не могу использовать powermock, поскольку его использование заставляет тесты работать слишком медленно. – Aequitas

+0

Невозможно использовать powermock только для текущего класса?Влияние на один класс испытаний не должно быть заметным. – Flowryn

+0

yeh, но если он используется в одном тестовом классе, тогда другие люди тоже начнут его использовать, а затем вы в конечном итоге будете использовать его, и тесты устройства начнут принимать минуты для запуска. – Aequitas

Смежные вопросы