2016-11-17 16 views
6

Bài kiểm tra đơn vị đơn giản này luôn luôn trôi qua và tôi không thể hiểu tại sao.Uri.parse() luôn trả về giá trị null trong bài kiểm tra đơn vị

@RunWith(JUnit4.class) 
class SampleTest { 
    @Test testSomething() { 
     Uri uri = Uri.parse("myapp://home/payments"); 
     assertTrue(uri == null); 
    } 
} 

Những gì tôi đã cố gắng cho đến nay đang sử dụng một "truyền thống" URI (http://example.com) nhưng uri cũng null là.

Trả lời

4

Kiểm tra xem bạn có những điều sau đây trong tập tin gradle của ứng dụng của bạn:

android { 
    ... 
    testOptions { 
     unitTests.returnDefaultValues = true 
    } 

Uri là một lớp Android và như vậy không thể được sử dụng trong các thử nghiệm đơn vị địa phương, không có mã ở trên, bạn nhận được như sau:

java.lang.RuntimeException: Method parse in android.net.Uri not mocked. See http://g.co/androidstudio/not-mocked for details. 

Mã ở trên ngăn chặn ngoại lệ này và thay vào đó cung cấp triển khai giả trở về giá trị mặc định (null trong trường hợp này).

Tùy chọn khác là bạn đang sử dụng một số khuôn khổ trong các bài kiểm tra cung cấp việc triển khai các phương pháp trong lớp học Android.

+0

Tôi đã nêu trong OP của mình rằng bài kiểm tra đã qua để không có ngoại lệ nào bị ném. Hơn nữa tôi không chỉ cần một đối tượng Uri không null, tôi cần một đối tượng Uri với các thuộc tính cụ thể (sơ đồ, đường dẫn, v.v.) –

+0

Tôi đã thêm điều này, nhưng vẫn không hoạt động – Allen

0

Cuối cùng tôi chỉ cần thay đổi mã của tôi để chấp nhận các URI như String, vì vậy bây giờ nó hoạt động cả trong sản xuất và thử nghiệm và bỏ qua việc sử dụng Uri.parse(). Bây giờ khi cần một URI, tôi chỉ sử dụng uri.toString() thay vì phân tích cú pháp một số String.

+1

Tôi không nghĩ đó là một ý hay. Bằng cách sử dụng Uri, bạn cung cấp mức độ an toàn cao hơn so với chuỗi. Các chuỗi có thể chứa bất kỳ thứ gì, với Uri bạn biết ít nhất là nó là một Uri hợp lệ. Các bài kiểm tra đơn vị của bạn có nghĩa vụ phải tăng chất lượng mã của bạn, không làm giảm chất lượng của nó. Tôi thà chuyển bài kiểm tra này thành bài kiểm tra kết nối (Espresso). – Michael

2

Tôi giải quyết sự cố này với Robolectric.

đây là những đơn vị thử nghiệm của tôi cấu hình

build.gradle

dependencies { 
... 
testCompile 'junit:junit:4.12' 
testCompile "org.robolectric:robolectric:3.4.2" 
} 

kiểm tra lớp

@RunWith(RobolectricTestRunner.class) 
public class TestClass { 

    @Test 
    public void testMethod() { 
     Uri uri = Uri.parse("anyString") 
     //then do what you want, just like normal coding 
    } 
} 

nó làm việc cho tôi, hy vọng điều này có thể giúp bạn.

+0

Tại sao -1 về điều này? Trong tâm trí của tôi, đây là câu trả lời đúng thực tế bởi vì Robolectric mang đến cho bạn một triển khai thực tế của Uri, không chỉ là một mô hình, cùng với việc triển khai mọi thứ khác mà bạn sẽ cần để kiểm tra đơn vị Android. – Bradford2000

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