2012-04-18 37 views
20

Tôi là loại mới để Mockito và tôi đã tự hỏi làm thế nào tôi có thể stub một cặp get/set.Mockito: làm thế nào để khai thác getter setter

Ví dụ

public interface Dummy { 
    public String getString(); 
    public void setString(String string); 
} 

Làm thế nào tôi có thể làm cho họ cư xử đúng: nếu ở đâu đó trong một thử nghiệm tôi gọi setString("something"); Tôi muốn getString() để trở về "cái gì đó". Điều đó có khả thi hay là có cách nào tốt hơn để xử lý các trường hợp như vậy?

+1

Có một lý do bạn muốn chế nhạo 'Dummy' và không thể chỉ sử dụng một đối tượng thường xuyên thực hiện nó? – darrengorman

+1

Điều gì @milkplusvellocet cho biết. Ngoài ra, nếu bạn thực sự muốn/cần phải thử nghiệm một setter, bạn đang làm thử nghiệm và/hoặc setters sai. –

+0

@milkplusvellocet thực sự tôi đang đặt HttpServletRequest và tôi muốn thuộc tính characterSetEncoding hoạt động. Có quá nhiều phương pháp để thực hiện để sử dụng một đối tượng thông thường. Điều này khiến tôi nghĩ, chúng ta có thể giả lập các lớp trừu tượng không? Nếu vậy, thì đó sẽ là một giải pháp cho tôi. Tôi sẽ nhìn vào ngày mai, tôi không có không gian làm việc với tôi. –

Trả lời

28

Tôi cũng muốn getter trả về kết quả của cuộc gọi setter gần đây.

class Dog 
{ 
    private Sound sound; 

    public Sound getSound() { 
     return sound; 
    } 
    public void setSound(Sound sound) { 
     this.sound = sound; 
    } 
} 

class Sound 
{ 
    private String syllable; 

    Sound(String syllable) { 
     this.syllable = syllable; 
    } 
} 

tôi đã sử dụng sau đây để kết nối các setter cho getter:

final Dog mockedDog = Mockito.mock(Dog.class, Mockito.RETURNS_DEEP_STUBS); 
// connect getter and setter 
Mockito.when(mockedDog.getSound()).thenCallRealMethod(); 
Mockito.doCallRealMethod().when(mockedDog).setSound(Mockito.any(Sound.class)); 
0

Trong trường hợp đặc biệt này cho HttpServletRequest stubbing tôi khuyên các bạn nên sử dụng Spring framework-Mock: (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mock/web/package-summary.html)

Nó có mocks built-in cho các hoạt động dựa trên web.

Nếu không sử dụng trả lời để xác định phản ứng của riêng bạn cho các đối tượng chế giễu của bạn (http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/stubbing/Answer.html)

6

tôi có thể nghĩ đến ba cách tiếp cận tốt.

  1. Không sử dụng HttpServletRequest trực tiếp trong đơn đăng ký của bạn; tạo lớp bao bọc cho nó và có giao diện cho lớp trình bao bọc. Bất cứ nơi nào bạn hiện đang sử dụng HttpServletRequest trong ứng dụng, hãy sử dụng giao diện thay thế. Sau đó, trong thử nghiệm, có một thực hiện thay thế của giao diện này. Sau đó, bạn không cần giả lập Mockito chút nào.

  2. Có một trường trong lớp thử nghiệm lưu trữ giá trị mà bạn đã đặt String thành. Tạo hai đối tượng Mockito Answer; một giá trị trả về giá trị của trường này khi được gọi là getString và một giá trị khác đặt giá trị của trường này khi được gọi là setString. Tạo mô hình theo cách thông thường, và sử dụng cả hai câu trả lời này.

  3. Tạo lớp trừu tượng (có thể là lớp bên trong tĩnh của lớp thử nghiệm) thực hiện giao diện HttpServletRequest, nhưng có trường mà bạn muốn đặt và xác định trình lấy và đặt. Sau đó, giả sử lớp trừu tượng và chuyển Mockito.CALLS_REAL_METHODS vào làm câu trả lời mặc định. Khi bạn gọi getter hoặc setter trên giả lập, phương thức thực sự sẽ khởi động, đó là hành vi mà bạn muốn.

Hy vọng rằng, một trong ba lựa chọn thay thế này sẽ đáp ứng nhu cầu của bạn.

+1

HttpSevletRequest là một giao diện thực sự, điều duy nhất là nó có quá nhiều phương pháp để thực hiện để muốn làm điều đó. Đối với lựa chọn thứ hai, đây có lẽ là cách tiếp cận tốt nhất. Tôi muốn sử dụng một lớp trừu tượng mà chỉ định nghĩa hai phương thức đó. Tôi sẽ đăng giải pháp mà tôi đã chọn. –

+0

Rất tiếc, xin lỗi, tôi quên đó là một giao diện. Tôi không chắc chắn về tùy chọn 1 nữa; Tôi cần biết thêm về mã của bạn để biết tôi có thể làm việc này không. Bạn có muốn thử tùy chọn 2 không? Tôi rất vui được giúp đỡ nếu bạn cần. –

+0

Thực ra, tôi nghĩ rằng việc sử dụng một lớp trừu tượng có thể hoạt động trong Mockito. Tất cả những gì tôi phải làm là chỉ ra rằng tôi muốn gọi "phương thức thực" cho getter và setter. Tôi tìm thấy liên kết này có thể thú vị: http://marcschwieterman.com/blog/simple-stub-creation-with-mockito-partial-mocks/ –

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