2012-05-26 29 views
7

Tôi hiện đang viết một vài bài kiểm tra liên quan đến JMock. Tôi không thể hiểu được cấu trúc sau đây của mã:JMock - cú pháp lạ để thêm kỳ vọng

context.checking(new Expectations() { //context is of type Mockery of course 
      { 
       allowing(csv).getFileName(); 
       will(returnValue(fileName)); 
      } 
     }); 

Phân tích chậm rãi, như xa như tôi biết,

context.checking(new Expectations() { ... } 

này sẽ tạo ra một instantiateion anonoymous của Expectations. Nhưng tại sao chúng ta có một dấu ngoặc nữa ngay sau này, và sau đó một số lạ, tĩnh tôi tin rằng, phương pháp như cho phép() vv? Nếu ai đó có thể giải thích cho tôi từ quan điểm của Java về những gì đang xảy ra ở đây tôi sẽ rất biết ơn.

Trả lời

6

Bộ niềng răng thứ hai tạo thành một instance initialization block và mã của nó được sao chép bởi trình biên dịch vào mọi hàm tạo cho lớp. Điều này cho phép bạn truy cập vào các thành viên cá thể. Trong trường hợp API của JMock, nó cung cấp một cách ngắn gọn để khởi tạo các kỳ vọng. Bạn có thể đạt được điều tương đương (mặc dù với một cảnh báo khi biên dịch Expectations chính nó về một cuộc gọi không an toàn đến một phương thức overridable từ constructor) với một phương thức mẫu.

public abstract class Expectations { 
    public Expectations() { 
     buildExpectations(); 
    } 

    protected abstract void buildExpectations(); 

    ... 
} 

Và trong thử nghiệm của bạn

context.checking(new Expectations() { 
    protected void buildExpectations() { 
     allowing(csv).getFileName(); 
     will(returnValue(fileName)); 
    } 
}); 

Tôi chắc chắn thích phiên bản ngắn hơn. :)

1

Một số người tin rằng tạo ra kỳ vọng trong bộ khởi tạo tĩnh, với phương pháp tĩnh cung cấp cú pháp tìm kiếm, dễ hiểu, thông thạo và dễ đọc để xác định các kỳ vọng - và tôi đồng ý với chúng. Cú pháp khó xử không chỉ là điều thú vị trong các khuôn khổ mocking - có rất nhiều thao tác bytecode mát mẻ dưới mui xe.

+1

Không thực sự trả lời câu hỏi của tôi Tôi sợ – Bober02

6

Trình khởi tạo sơ thẩm thú vị. Họ chỉ đặt tôi đã thực sự nhìn thấy chúng được sử dụng rất nhiều là với JMock. Hãy xem xét một ngữ cảnh dễ hiểu hơn. Bạn có thể tạo bản đồ và thêm các mục vào nó:

Map<String,String> map = new HashMap<String,String>(){ 
    { 
     put("One","Something"); 
     put("Two","Other"); 
    } 
}; 

Có lẽ điều này sẽ giúp bạn xem JMock đang làm gì.

Các vấn đề liên quan