2012-10-31 35 views
11

Tôi đang thử nghiệm một phương thức void xảy ra để gọi một số phương thức void khác trong một lớp (tất cả các phương thức này nằm trong cùng một lớp). Phương pháp này là gì đó dọc theo các dòng này ...Làm thế nào để bỏ qua một số lời gọi phương thức void bên trong một phương thức void trong Mockito

public void methodToTest() { 
    methodA(); 
    methodB(); 
} 

void methodA() { 
    methodA1(); 
    methodA2(); 
    methodA3(); 
} 

Điều tôi muốn làm là gây ra methodA() ở trên để không làm gì cả. Đó là, tôi muốn methodA() về cơ bản là như thế này:

void methodA() { } 

Tôi đã thử cả hai doThrow()doAnswer() trên methodA() vô ích. Nó như thể cả hai đều bị bỏ qua hoàn toàn.

Một ví dụ về những gì tôi đã cố gắng ...

doThrow(new RuntimeException()).when(mockedClass).methodA(); 

Có cách nào để làm điều này chỉ sử dụng Mockito? Tôi không có quyền tự do thay đổi lớp đang được sửa đổi.

+1

Điều này sẽ hoạt động, bạn có chắc 'phương thứcA' không phải là' cuối cùng' không? – Brice

+0

'phương thứcA' không phải là 'cuối cùng' –

+1

nhìn lại đoạn mã của bạn trông giống như bạn muốn thực hiện một phần mô phỏng, có thể chỉ thực hiện' phương thức', trong khi bạn đang thực hiện 'phương thứcA'. Bạn chắc chắn nhất là sử dụng 'mock (YourObject.class)', sau đó tất nhiên một mô hình không làm gì cả, và chắc chắn sẽ không bao giờ thực thi mã thực. Bạn có thể đạt được những gì bạn muốn một 'spy (YourObject.class)' nó sẽ thực thi mã thực theo mặc định. Tuy nhiên một phần mocks được công nhận là mùi thử nghiệm, nếu không phải là mùi thiết kế, bạn nên tìm kiếm các cơ hội để làm cho hành vi của 'methodA' như là một phụ thuộc mà bạn có thể phơi bày trong API của bạn như là một' AStrategy' chẳng hạn. – Brice

Trả lời

18

Nếu bạn đang tìm cách để methodB vẫn thực thi, trong khi methodA không làm gì cả. Điều này sẽ làm điều đó:

TestClass spy = spy(new TestClass()); 
doNothing().when(spy).methodA(); 
spy.methodToTest(); 
+0

Tôi đã không đề cập đến nó ở trên, nhưng tôi thực sự đang sử dụng một điệp viên như bạn liệt kê trong ví dụ của bạn. Tôi đã cố gắng mã này chính xác trong lớp của tôi và internals của methodA() vẫn đang được thực hiện đó là những gì tôi đang cố gắng để tránh ... –

+1

là bạn sử dụng các ký hiệu ngược của 'doNothing(). When()' như trên, hoặc bạn đang sử dụng ký hiệu 'when(). thenReturn()'? Dạng thứ hai thực sự gọi phương thức thực trên một Spy khi dòng lệnh 'khi' đang được gọi (tức là, khi hành vi thay thế của mô hình một phần bị thay đổi), và điều đó có thể gây ra vấn đề. Do đó cần phải sử dụng ký hiệu 'doNothing' trước đây để gián điệp để tránh vấn đề đó –

+0

@KevinWelker - Tôi đang sử dụng' doNothing(). When() ' –

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