2014-04-15 21 views
6

Dưới đây là phương pháp riêng của tôi trong lớp DataTap của tôi và tôi đang cố gắng để kiểm tra JUnit phương pháp tin này sử dụng jmockit -Làm thế nào để vượt qua chuỗi rỗng để một phương pháp riêng sử dụng jmockit trong khi đơn vị thử nghiệm nó?

private void parseResponse(String response) throws Exception { 
    if (response != null) { 
     // some code 
    } 
} 

Vì vậy, dưới đây là thử nghiệm junit tôi đã viết nhưng đối với trường hợp null, nó được ném NPE bằng cách nào đó trên bản thân kiểm tra junit.

DataTap tap = new DataTap(); 
Deencapsulation.invoke(tap, "parseResponse", "hello"); 

// this line throws NPE 
Deencapsulation.invoke(tap, "parseResponse", null); 

Vì vậy, câu hỏi của tôi là - Có cách nào tôi có thể vượt qua null string để parseResponse phương pháp sử dụng JMOCKIT như một phần của thử nghiệm junit?

Đây là những gì tôi nhìn thấy trên dòng đó -

Các đối số kiểu rỗng một cách rõ ràng nên được đúc vào Object [] cho invocation của invoke phương pháp varargs (Object, String, Object .. .) từ loại Deencapsulation. Nó có thể được chuyển sang đối tượng cho một yêu cầu varargs

+0

Đó là mã nên làm việc. Tôi nghĩ rằng vấn đề là ở một nơi khác. – tbodt

+0

Điều này tôi có thể nhìn thấy trên dòng đó 'Đối số của kiểu null sẽ được đúc thành Object [] để gọi phương thức varargs gọi (Object, String, Object ...) từ kiểu Deencapsulation. Nó có thể được chuyển sang Object cho một lời gọi varargs và nó thực sự thất bại. – john

Trả lời

14

Nhìn lướt qua at the documentation gợi ý rằng những gì bạn đang cố gắng để làm với chữ ký đó là không thể:

... nếu một nhu cầu giá trị null được thông qua, các đối tượng class cho kiểu tham số phải được thông qua thay vì

Nếu đó là trường hợp, sau đó vượt qua trong đối tượng Class cũng như các ví dụ.

Deencapsulation.invoke(tap, "parseResponse", String.class); 
+0

Cảm ơn Makoto. Tôi đã thử điều này và tôi đã nhận 'Giá trị null không hợp lệ được truyền như một đối số 1'. Bất cứ đề nghị gì là sai? – john

+1

Vượt qua đối tượng Lớp * thay vì * của 'null', không phải ngoài nó:' Deencapsulation.invoke (tap, "parseResponse", String.class) '.Do quá tải phương thức, JMockit cần phải biết loại của mỗi tham số, do đó nó có thể tìm thấy phương thức mong muốn thông qua Reflection; một kiểu như vậy chỉ có thể được xác định từ một đối số không null * hoặc * bằng cách chuyển nó một cách rõ ràng trong lời gọi đến 'invoke (...)'. –

+0

Tài liệu hiện có tại: http://jmockit.org/tutorial/ReflectionUtilities.html#deencapsulatingMethods – jordanpg

0

Làm những gì lỗi nói. Nghĩa là, thay đổi dòng này:

Deencapsulation.invoke(tap, "parseResponse", (Object) null); 
+0

Cảm ơn tbodt. Tôi đã thử điều này và tôi nhận được 'Giá trị null không hợp lệ được chuyển như một đối số 0'. Bất cứ đề nghị gì là sai? – john

0

tôi đã làm như vậy khi tôi cần phải vượt qua chuỗi null trong phương thức toString tức là qua quá trình đúc các null vào loại cần

mockedObject.toString((String) null) 
0

Bạn đang sử dụng phương pháp tiện lợi và bạn cần phải sử dụng đầy đủ các phương pháp . Có hai phương thức để gọi một phương thức trên một cá thể đối tượng. Phương thức đầu tiên hoạt động bằng cách lấy các parameterTypes từ nonNullArgs.

Deencapsulation.invoke(instance, methodName, nonNullArgs); 
Deencapsulation.invoke(instance, methodName, parameterTypes, methodArgs); 

Bạn cần phải vượt qua trong parameterTypes nếu một trong các args là null như thế này:

DataTap tap = new DataTap(); 
String response = null; 
Class[] parameterTypes = { String.class }; 
Deencapsulation.invoke(tap, "parseResponse", parameterTypes, response); 
Các vấn đề liên quan