2015-05-28 35 views
8

Tôi mới dùng thử Đơn vị và tôi muốn kiểm tra SQLiteDataBase của mình.Thử nghiệm Đơn vị Android Studio SQLiteDataBase is null

Tôi có một lớp học có tên MySQLiteHelper kéo dài SQLiteOpenHelper. Tôi có một lớp có tên là LocationDataHandler mà tôi sử dụng để thêm hoặc xóa các phần tử khỏi DataBase của mình. Và tôi có một lớp học LocationDataHandlerTest, mở rộng AndroidTestCase, để kiểm tra lớp học LocationDataHandler của tôi.

Tôi đang cố gắng kiểm tra Cơ sở dữ liệu SQLite của mình nhưng dường như tôi đã mất một chút giữa tất cả các ngữ cảnh khác nhau.

đây là mã của tôi:

//Context context = new Activity(); 

//IsolatedContext context = getMockContext(); 

//Context context = new MockContext(); 

//Context context = getInstrumentation().getContext(); 

    Context context = getContext(); 

    helper = new MySQLiteHelper(context); 
    assertNotNull(helper); 

    SQLiteDatabase db = helper.getWritableDatabase(); 
    assertNotNull(db); <---- it fails here ! 

như bạn có thể thấy tôi đã cố gắng với nhiều hoàn cảnh khác nhau mà tôi thấy mọi người sử dụng và làm việc với. Tôi thực sự không hiểu tại sao nó không hoạt động trong trường hợp của tôi.

Vấn đề của tôi là thử nghiệm không thành công trên dòng "assertNotNull (db);" có nghĩa là tôi không bao giờ có thể lấy dataBase của tôi.

Tôi có làm điều này sai không? Tôi không sử dụng đúng ngữ cảnh?

Sửa: Đây là logcat của tôi:

junit.framework.AssertionFailedError 
    at junit.framework.Assert.fail(Assert.java:55) 
    at junit.framework.Assert.assertTrue(Assert.java:22) 
    at junit.framework.Assert.assertNotNull(Assert.java:256) 
    at junit.framework.Assert.assertNotNull(Assert.java:248) 
    at junit.framework.TestCase.assertNotNull(TestCase.java:417) 
    at com.databerries.LocationDataHandlerTest.testAddLocation(LocationDataHandlerTest.java:72) 
+0

bạn có thể thêm logcat không? chỉ để biết được vấn đề của bạn là gì .. –

+0

Bạn đã thử 'getInstrumentation.getTargetContext()' chưa? –

+0

có, nó ném cho tôi một ngoại lệ con trỏ null trên dòng: 'bối cảnh bối cảnh = getInstrumentation(). GetTargetContext();' –

Trả lời

1

Vâng, đó là một vấn đề ngữ cảnh. Tất cả các ngữ cảnh đó (bao gồm cả các ngữ cảnh bạn nhận xét) đều không có giá trị.

Bạn có thể tạo ra một bối cảnh:

context = new MockContext(); 

Đối với cơ sở dữ liệu tương tự (hoặc các nguồn lực khác) như ứng dụng của bạn, bạn có thể sử dụng (kể từ khi bạn đang sử dụng AndroidTestCase):

context = getInstrumentation().getContext(); 

Có một cách thích hợp để tạo và sử dụng một RoamingDelegatingContext, nhưng nó không xuất hiện mà bạn cần điều đó cho thử nghiệm của bạn.

Bạn có thể xem xét đọc Android Testing Fundamentals để giúp hiểu một số vấn đề về kiểm tra và mức độ truy cập/tài nguyên cần thiết.

+1

hi! cảm ơn bạn đã trả lời nhưng không có giải pháp nào hiệu quả ... ngữ cảnh = new MockContext(); mang lại cho tôi cùng một lỗi mà cơ sở dữ liệu của tôi là null. Và bối cảnh = getInstrumentation(). GetContext(); cung cấp cho tôi lỗi này: java.lang.NullPointerException tại com.databerries.LocationDataHandlerTest.testAddLocation (LocationDataHandlerTest.java:66) (dòng 66 là dòng có context = getInstrumentation(). getContext();) –

+0

@ ThéoRichard Hãy thử thay đổi loại thử nghiệm của bạn vào ActivityTestCase hoặc InstrumentationTestCase. Tôi vừa mới nhận ra rằng mình đã hiểu sai tài liệu và nghĩ rằng AndroidTestCase là một phân lớp của InstrumentationTestCase (nó thực sự là ActivityTestCase đó là lớp con). Sau đó, bạn có thể thử lại cuộc gọi getInstrumentation(). GetContext(). – iheanyi

+1

vẫn còn lỗi tương tự, java.lang.NullPointerException tại com.databerries.LocationDataHandlerTest.testAddLocation (LocationDataHandlerTest.‌ java: 66) (dòng 66 là dòng có context = getInstrumentation(). GetContext();) –

0

Trong khi thử nghiệm trong Android, chúng tôi thường mô phỏng tệp và cơ sở dữ liệu. Nếu chúng tôi đang thử nghiệm trên thiết bị thực, chúng tôi không muốn ảnh hưởng đến các tệp hiện có. Vì vậy, trong những trường hợp này, việc sử dụng ngữ cảnh sẽ hướng các cuộc gọi đến hệ thống tệp của ứng dụng cụ thể của chúng tôi.

Do đó, chúng tôi loại bỏ các loại hoạt động này bằng cách sử dụng RenamingDelegatingContext. Lớp này đại diện cho ngữ cảnh đã cho, nhưng thực hiện các hoạt động của cơ sở dữ liệu và tệp bằng tên cơ sở dữ liệu/tệp được đổi tên. Bạn nên sử dụng bối cảnh như sau:

RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_db"); 
helper = new MySQLiteHelper(context); 
assertNotNull(helper); 
SQLiteDatabase db = helper.getWritableDatabase(); 
assertNotNull(db); 
+0

asserNotNull (db); tuyên bố vẫn không thành công ... –

+0

@ ThéoRichard bạn đã kiểm tra lớp Trợ giúp của bạn nếu các mã để tạo cơ sở dữ liệu là chính xác? –

0

Để thử nghiệm với Android Studio,

Bạn nên sử dụng MockContext thay vì RenamingDelegatingContext.

Sử dụng InstrumentationTestCase.

Để biết thêm thông tin, hãy xem câu trả lời này. https://stackoverflow.com/a/29063736/1020456

Đây là mã của tôi.

public class DatabaseHelperTest extends InstrumentationTestCase{ 

private DatabaseHelper db; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 

    MockContext context = new MockContext(); 
    db = DatabaseHelper.getInstance(context); 
} 

@After 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

public void testInsertUserInteraction() throws Exception { 
    assertNotNull(db.getReadableDatabase()); //should pass 
} 

}

1

Mở rộng lớp thử nghiệm của bạn từ AndroidTestCase và sử dụng mContext như dưới đây mẫu mã:

public class MyDbHelperTest extends AndroidTestCase { 

private DatabaseHelper db; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 
    db = DatabaseHelper.getInstance(mContext); 
} 

@After 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

public void testOpeningDb() throws Exception { 
    assertNotNull(db); 
    SQLiteDatabase sqliteDb = db.getWritableDatabase(); 
    assertNotNull(sqliteDb); 
    } 

}

mContext được thừa hưởng để lớp này từ AndroidTestCase lớp. Điều đó sẽ hoạt động như tôi đã có cùng một vấn đề.

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