2011-11-29 14 views
16

Tôi muốn thử phương pháp được bảo vệ được kế thừa. Tôi không thể gọi phương thức này trực tiếp từ mã java vì nó được kế thừa từ lớp trong gói khác. Tôi không thể tìm thấy một cách để xác định phương pháp này để còn sơ khai ở trong when(...)phương pháp được bảo vệ bằng mocking

package a; 

public class A() { 
    protected int m() {} 
} 

package b; 

public class B extends a.A { 
    // this class currently does not override m method from a.A 
    public asd() {} 
} 

// test 
package b; 

class BTest { 
    @Test 
    public void testClass() { 
     B instance = PowerMockito.spy(new B()); 
     PowerMockito.when(instance, <specify a method m>).thenReturn(123); 
     //PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work 
    } 
} 

Tôi nhìn PowerMockito.when ghi đè và điều này dường như họ là tất cả chỉ phương pháp tư nhân!

Cách chỉ định phương pháp được bảo vệ?

+0

@AndroidKiller, mã được cập nhật với tên lớp. Trên thực tế họ có thể từ Mockito, nhưng tôi sử dụng powermock và những phương pháp này có ý nghĩa tương tự có –

+0

Đó là lý do tại sao chúng ta nên luôn luôn thích thành phần hơn thừa kế. Nếu bạn không thể chỉ xác định lại phương thức này trong mã được thử nghiệm của mình, giống như bạn sẽ làm với mã cũ. – Brice

Trả lời

24

Nutshell: Không thể luôn sử dụng when để gián điệp; sử dụng doReturn.

Giả sử nhập khẩu tĩnh của spydoReturn (cả PowerMockito):

@RunWith(PowerMockRunner.class) 
@PrepareForTest(B.class) 
public class BTest { 
    @Test public void testClass() throws Exception { 
     B b = spy(new B()); 
     doReturn(42).when(b, "m"); 
     b.asd(); 
    } 
} 

Bạn cũng @PrepareForTest(A.class) và có thể thiết lập các doReturn trên when(a, "m"). Điều này có ý nghĩa hơn tùy thuộc vào thử nghiệm thực tế.

+0

wow, cảm ơn bạn. Thật thú vị khi tôi đã cố gắng sử dụng dụ phương pháp thay vì phương pháp tên chuỗi stubbing thất bại với thông báo ngoại lệ về số lượng sai của các đối số. Nhưng với tên chuỗi tất cả các công trình hoàn hảo. –

+0

@mishanesterenko Vâng, đôi khi nó có thể hơi phức tạp. Một tùy chọn khác luôn luôn phân lớp 'B' cho mục đích của thử nghiệm. Không phải lúc nào cũng là một lựa chọn, nhưng ít "huyền diệu" hơn sửa đổi bytecode;) –

+0

Bạn sẽ làm gì nếu bạn đã thiết lập khoảng trống trả về Methode. Giả sử 'm' là một bộ-Methode như void m (trình phân tích cú pháp MySpecialParser). Trình phân tích cú pháp này được sử dụng để phân tích cú pháp văn bản của tôi. Làm thế nào tôi có thể thử nó? – Kayser