2012-09-19 26 views
10

Tôi là người mới đến thử nghiệm đơn vị. Tôi đang sử dụng TestNG với MyEclipse để phát triển các trường hợp kiểm thử đơn vị cho ứng dụng của tôi. Trong khi làm điều đó tôi đang phải đối mặt với một số vấn đề với EasyMock. Đây là mã của tôi (Tên của lớp, tên phương thức và kiểu trả về được thay đổi vì lý do bảo mật nhưng bạn sẽ nhận được một ý tưởng rõ ràng về những gì tôi đang cố gắng đạt được ở đây).Kiểm tra Ngoại lệ của một phương pháp với EasyMock

public MyClass 
    { 
     // This is a method in my class which calls a collaborator which I 
     // want to mock in my test case 
     public SomeObject findSomething(SomeOtherObject param) throws Exception 
     { 
      SomeOtherObject param a = myCollaborator.doSomething(param); 
      // Do something with the object and then return it 
      return a; 
     } 
    } 

Bây giờ, đây là thử nghiệm của tôi. Bây giờ những gì tôi thực sự muốn đạt được trong thử nghiệm của tôi trường hợp là tôi muốn kiểm tra xem chức năng của tôi (findSomething) đúng cách ném ngoại lệ trong trường hợp một số ngoại lệ được ném. Trong tương lai, một số nhà phát triển khác có thể thay đổi chữ ký (ném ngoại lệ không phải là thực sự là một phần của chữ ký phương thức) của phương pháp và loại bỏ các ném Ngoại lệ từ phương pháp của tôi. Vậy làm thế nào tôi có thể chắc chắn rằng không ai thay đổi nó?

@Test(dataProvider="mydataProvider", expectedExceptions=Exception.class) 
public void MyTest(SomeOtherObject param) throws Exception { 
{ 
    EasyMock.expect(myCollaboratorMock.doSomething(param)).andThrow(new Exception()); 
    EasyMock.replay(myCollaboratorMock); 
} 

Tôi nhận được ngoại lệ

"java.lang.IllegalArgumentException: Phương pháp cuối cùng kêu gọi giả không thể ném java.lang.Exception"

gì tôi làm sai đây? Ai đó có thể làm sáng tỏ về cách viết test case cho trường hợp cụ thể của tôi không?

Trả lời

18

Phương thức doSomething() của cộng tác viên không tuyên bố rằng nó có thể ném Ngoại lệ, và bạn đang yêu cầu giả mạo của nó ném một. Điều đó là không thể.

Ngoại lệ là ngoại lệ được kiểm tra. Nó chỉ có thể được ném nếu nó được khai báo trong chữ ký phương thức. Nếu phương thức không có mệnh đề throws, tất cả những gì có thể làm là ném ngoại lệ thời gian chạy (tức là RuntimeException hoặc bất kỳ lớp hậu duệ nào).

+0

Sai. Bằng cách sử dụng [generic quirks] (http://java.dzone.com/articles/throwing-undeclared-checked) nó có thể ném các ngoại lệ đã kiểm tra từ khá nhiều ở khắp mọi nơi. – jontejj