2013-02-13 3 views
0

У меня есть интересный сценарий, где мне нужно ввести ссылку File в мой POJO (так что в моих тестовых классах я могу заглушить File и не писать что-нибудь на диск), но имя файла не будет на самом деле известно только во время выполнения:Как вставить java.io.File, а затем установить его имя

public class MyPOJO { 
    private File file; 

    private FileWriter writer; 

    // Getter and setter for file & writer 

    public void writeToDisk(String message) { 
     String fileName = complexLogicToBuildFileName(); 

     // How do I do the equivalent of: file.setName(fileName); 

     try { 
      writer.write(message); 

      writer.close(); 
     } catch(IOException ioe) { 
      ... 
     } 
    } 
} 

public class MyPOJOTest { 
    @Test 
    public void verifyWriteToDiskAttemptsToWrite() { 
     MyPOJO pojo = new MyPOJO(); 
     File mockFile = Mockito.mock(File.class); 
     FileWriter mockWriter = Mockito.mock(FileWriter.class); 

     Mockito.doNothing().when(mockWriter).write(Mockito.anyString()); 

     pojo.setWriter(mockWriter); 
     pojo.setFile(mockFile); 

     pojo.writeToDisk("This won't write to disk."); 

     Mockito.verify(mockWriter).write("This won't write to disk."); 
    } 
} 

проблема заключается в том, из-за вынужденный File(String) конструктора, я должен связать свой впрыскиваются File экземпляра к имя файла до У меня есть шанс выполнить complexLogicToBuildFileName(), и это не может быть перезаписано простой метод сеттера. Любые идеи относительно того, как я мог бы сохранить file и fileWriter как внедренные свойства (для проверки), но все же позвольте мне использовать complexLogicToBuildFileName(), чтобы назвать файл? Заранее спасибо.

ответ

2

Я не понимаю, почему вы нагнетание FileиFileWriter, и ваш POJO получает имя файла тоже (через complexLogicToBuildFileName()).

Если вы хотите, чтобы абстрагироваться из письма, почему бы не просто вводить свой POJO с Writer (интерфейс), и вы можете выбрать высмеивал версию (или даже StringWriter), а не обеспечить FileWriter. Затем вы можете извлечь complexLogicToBuildFileName() в новый объект (скажем, FileNameBuilder) и протестировать его отдельно.

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