2011-07-15 28 views
5

Tôi có lớp sau đây:Làm thế nào để viết một bài kiểm tra đơn vị để bao gồm trường hợp một IOException được ném?

public class FileLoader { 

     private Map<Brand, String> termsOfUseText = new HashMap<Brand, String>(); 

     public void load() { 
      for (Brand brand : Brand.values()) { 
       readAndStoreTermsOfUseForBrand(brand); 
      } 
     } 

     private void readAndStoreTermsOfUseForBrand(Brand brand) { 
      String resourceName = "termsOfUse/" + brand.name().toLowerCase() + ".txt";   
      InputStream in = this.getClass().getClassLoader().getResourceAsStream(resourceName);    
      try { 
       String content = IOUtils.toString(in);   
       termsOfUseText.put(brand, content); 
      } catch (IOException e) { 
       throw new IllegalStateException(String.format("Failed to find terms of use source file %s", resourceName),e); 
      } 
     } 

     public String getTextForBrand(Brand brand) { 
      return termsOfUseText.get(brand); 
     } 
    } 

Nhãn hiệu là một enum, và tôi cần tất cả các file .txt hợp lệ để được vào classpath. Làm thế nào để làm cho IOException xảy ra, cho rằng Enum thương hiệu chứa tất cả các thương hiệu hợp lệ và do đó tất cả các tập tin .txt cho chúng tồn tại?

Gợi ý xung quanh việc tái cấu trúc mã hiện tại được hoan nghênh nếu nó làm cho nó dễ kiểm tra hơn!

+0

+1 - Tôi sẽ ghi đè lên các enum và tạo một enum giả bao gồm tên tập tin không hợp lệ .Also gợi ý cho thấy enum thương hiệu của bạn và làm thế nào là tải funcation được gọi là và thương hiệu thông qua. – Shahzeb

+1

Enums là cuối cùng. Ghi đè không phải là một tùy chọn. –

Trả lời

0

Tệp bị thiếu sẽ gây ra NullPointerExceptiongetResourceAsStream sẽ trả lại null và bạn sẽ có in==null. IOException trong trường hợp này có thể thực sự là khá hiếm. Nếu nó quan trọng đối với bạn để xem nó, tôi chỉ có thể nghĩ đến việc thiết lập mã này để ném nó nếu mã được thực hiện trong phạm vi kiểm tra. Nhưng nó thực sự quan trọng?

-1

Mã dưới đây là hoàn toàn chưa được kiểm tra
Để làm cho sử dụng IOException:

FileInputStream in = this.getClass().getClassLoader().getResourceAsStream(resourceName); 
in.mark(0); 
//read some data 
in.reset(); //IOException 

Để kiểm tra các trường hợp IOException sử dụng:

void test 
{ 
    boolean success = false; 
    try 
    { 
     //code to force ioException 
    } 
    catch(IOException ioex) 
    { 
     success = true; 
    } 
    assertTrue(success); 
} 

Trong Junit4

@Test(expected=IOException.class) 
void test 
{ 
    //code to force ioException 
} 

JUnit khác

void test 
{ 
    try 
    { 
    //code to force IOException 
    fail("If this gets hit IO did not occur, fail test"); 
    } 
    catch(IOException ioex) 
    { 
    //success! 
    } 
} 
+0

Câu trả lời này không giải quyết được câu hỏi như thế nào đã được bình chọn lên !!! – Shahzeb

+0

Làm thế nào mà không giải quyết được câu hỏi? Nó cho thấy rõ ràng làm thế nào bạn có thể viết mã mà sẽ có một bài kiểm tra đơn vị vượt qua khi một ngoại lệ được mong đợi. – Woot4Moo

+0

Câu hỏi đặt ra là làm thế nào để gây ra IOException để được ném vào thử nghiệm, không phải làm thế nào để xử lý một IOException trong một thử nghiệm. –

3

Ba tùy chọn tôi nhìn thấy ngay off:

  1. Sử dụng PowerMock để thử IOUtils.toString(). Tôi coi PowerMock là một phương án cuối cùng. Tôi muốn thay đổi cấu trúc nguồn thành một thứ gì đó thân thiện hơn một chút.
  2. Trích xuất lời gọi IOUtils thành một phương thức được bảo vệ. Tạo một lớp con cụ thể kiểm tra của lớp của bạn ghi đè phương thức này và ném ra IOException.
  3. Trích xuất việc tạo luồng đầu vào thành một phương thức được bảo vệ. Tạo một phân lớp thử nghiệm cụ thể để ghi đè phương thức và trả về một InputStream giả lập.
0

Tôi sẽ sử dụng mô hình để thực hiện việc này.

Ví dụ (chưa được kiểm tra, chỉ để cung cấp cho bạn một số suy nghĩ):

@Test(expected=IllegalStateException.class) 
public void testThrowIOException() { 
    PowerMockito.mockStatic(IOUtils.class); 
    PowerMockito.when(IOUtils.toString()).thenThrow(
      new IOException("fake IOException")); 
    FileLoader fileLoader = new FileLoader(); 
    Whitebox.invokeMethod(fileLoader, 
      "readAndStoreTermsOfUseForBrand", new Brand(...)); 
    // If IllegalStateException is not thrown then this test case fails (see "expected" above) 
} 
Các vấn đề liên quan