working effectively with legacy code 2009 test - andstudy/forge GitHub Wiki

μ˜ˆμ™Έ λ°œμƒ ν…ŒμŠ€νŠΈ

질문

  • http://cafe.naver.com/ArticleRead.nhn?clubid=13516524&articleid=1056

  • μ•„λž˜ μ½”λ“œμ—μ„œ IOException 이 λ°œμƒν• λ•Œ G3P1EP2Exception 이 λ°œμƒν•˜λŠ” 것에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

  • 그런데 fos μ—μ„œ IOException 을 λ°œμƒμ‹œμΌœμ•Ό ν•˜λŠ”λ° μ–΄λ–»κ²Œ ν•˜λŠ”κ²Œ μ’‹μ„κΉŒμš”?

      public void saveData() throws G3P1EP2Exception { 
          File file = new File(_strFilePath);
          
          String strWorkingDirectory    = file.getParent();
          
          if(createDirectory(strWorkingDirectory) == false) {
              throw new G3P1EP2Exception(strWorkingDirectory + " 생성 μ‹€νŒ¨", ErrorCodeSet.ERR_SaveData_FailCreateDirectory);
          }
          
          FileOutputStream fos = null;
          
          try {
              fos = new FileOutputStream(file);
              fos.write(bbos.getByteBuffer(), 0, bbos.getSize());
          } 
          catch(IOException e) {
              throw new G3P1EP2Exception(_strFilePath + " 생성 μ‹€νŒ¨", ErrorCodeSet.ERR_SaveData_FailSaveFile);
          }
          finally {
              if (fos != null) {
                  try {
                      fos.close();
                  } 
                  catch (IOException e) {
                  }
              }
          }
      }
    

ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± μˆœμ„œ

  1. FileOutputStream 상속받아 κ°€μ§œ 클래슀 λ§Œλ“€κΈ° - FakeFileOutputStream
  2. κ°€μ§œ ν΄λž˜μŠ€μ—μ„œ μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” ν•¨μˆ˜ μž‘μ„±
  3. κ°€μ§œ 클래슀λ₯Ό μ‚¬μš©ν•˜κΈ°μœ„ν•΄ 뢄리접합지점(seam 봉합) λ§Œλ“€κΈ°
  4. κ°€μ§œ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μž‘μ„±

κ°€μ§œ 클래슀 λ§Œλ“€κΈ°

  • FileOutputStream 상속받아 κ°€μ§œ 클래슀 λ§Œλ“€κΈ° - FakeFileOutputStream

  • λŒ€μΆ© λ‹€μŒ μ½”λ“œμ™€ 같을 것이닀

  • write(...) ν•¨μˆ˜λŠ” 무쑰건 μ˜ˆμ™Έλ₯Ό λ˜μ§€κ²Œ λ§Œλ“€μ—ˆλ‹€

      import java.io.File;
      import java.io.FileNotFoundException;
      import java.io.FileOutputStream;
      import java.io.IOException;
      
      public class FakeOutputStream extends FileOutputStream {
      
          public FakeOutputStream(File file) throws FileNotFoundException {
              super(file);
          }
      
          @Override
          public void write(byte[] b, int off, int len) throws IOException {
              throw new IOException();
          }
      }
    

뢄리접합지점(seam 봉합) λ§Œλ“€κΈ°

  • κ°€μ§œ 클래슀λ₯Ό μ‚¬μš©ν•˜κΈ°μœ„ν•΄ 뢄리접합지점 λ§Œλ“ λ‹€

  • FileOutputStream 을 νŒŒλΌλ―Έν„°λ‘œ κ°€μ§€λŠ” saveData(...) ν•¨μˆ˜ λ§Œλ“€κΈ°

      public void saveData(FileOutputStream fos) throws G3P1EP2Exception {
          try {
              fos.write(bbos .getByteBuffer(), 0, bbos.getSize());
          } 
          catch(IOException e) {
              throw new G3P1EP2Exception(_strFilePath + " 생성 μ‹€νŒ¨", ErrorCodeSet.ERR_SaveData_FailSaveFile);
          }
      }
    
  • 기쑴의 saveData() ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 바뀐닀

      public void saveData() throws G3P1EP2Exception {
      // μƒλž΅
          try {
              fos = new FileOutputStream(file);
              saveData(fos);      // **** μ—¬κΈ°κ°€ λ°”λ€Œμ—ˆμŒ ****
          } 
          // μƒλž΅
      }
    

ν…ŒμŠ€νŠΈ μ½”λ“œ λ§Œλ“€κΈ°

  • 뢄리접합지점에 κ°€μ§œ 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μž‘μ„±

      public void testSaveData() throws IOException {
          // μ˜ˆμ™Έλ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” μ˜ˆμ „ 방식, JUnit 버전이 μ˜¬λžμœΌλ‹ˆ λ­”κ°€ 더 λ©‹μ§„ 방법이 μžˆμ§€ μ•Šμ„κΉŒ?
          try {
              new Data().saveData(new FakeOutputStream(File.createTempFile("temp", "tmp")));
              assertTrue(false);  // λ„λ‹¬ν•˜λ©΄ μ•ˆλ¨
          } catch (G3P1EP2Exception e) {
              assertTrue(true);   // μ—¬κΈ°λ₯Ό 톡과 ν•΄μ•Ό 함
              assertEquals(ErrorCodeSet.ERR_SaveData_FailSaveFile, e.getErrorCode());
          } catch (FileNotFoundException e) {
              assertTrue(false);  // λ„λ‹¬ν•˜λ©΄ μ•ˆλ¨
          } catch (IOException e) {
              assertTrue(false);  // λ„λ‹¬ν•˜λ©΄ μ•ˆλ¨
          }
      }
    

기타

  • 잘λͺ»λœ 뢀뢄이 μ—†λ‚˜ λͺ¨λ₯΄κ² λ„€μš”
  • μ’€ κ±°μŠ¬λ¦¬λŠ” 뢀뢄도 μžˆμœΌλ‹ˆ λŒ€μΆ© μ°Έκ³ ν•˜μ‹œκ³  더 λ‚˜μ€ ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€μ–΄ λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€
  • FileOutputStream 의 래퍼 클래슀λ₯Ό λ§Œλ“€κ³  κ±°κΈ°μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 뽑아 μ˜¬λ €λ„ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€