2015-05-31 20 views
6

Tôi đang cố gắng viết một kiểm tra junit đối với cơ sở dữ liệu ứng dụng của tôi trong Android Studio bằng cách sử dụng đối tượng SQLiteOpenHelper của tôi. Mỗi khi nó chạm vào phương thức chèn, tôi nhận được một NullPointerException. Tôi đã đi qua lại giữa việc sử dụng getContext() và thiết lập mockContext I nhưng không có con xúc xắc. Tôi có giả lập của tôi và chạy. Ai đó có thể cho tôi biết tôi đang làm gì sai không?Đang cố gắng kiểm tra SQLiteOpenHelper nhưng getWritableDatabase() ném Null

public class LocationDatabaseHelperTest extends AndroidTestCase { 

    private SQLiteDatabase testDB; 
    private SQLiteDatabase readDB; 
    private LocationDatabaseHelper dbh; 
    private RenamingDelegatingContext mockContext; 
    private ContentValues cv; 



    /** 
    *Sets up a mock context to initialize the 
    * LocationDatabaseHelper object. 
    * @throws Exception 
    */ 
    public void setUp() throws Exception { 
     super.setUp(); 


     final String prefix = "test"; 
     mockContext = new RenamingDelegatingContext(getContext(),prefix); 
     dbh = new LocationDatabaseHelper(mockContext); 

     try { 
      testDB = dbh.getWritableDatabase(); 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 

     readDB = dbh.getReadableDatabase(); 
     cv = new ContentValues(); 
    } 


    /** 
    *Tests that asserts LocationDatabaseHelper object instantiates. 
    */ 
    public void testLocationDatabaseHelper() { 
     assertNotNull(dbh); 
    } 



    public void testInsert() { 


     String id = "seattle"; 
     float heading = (float) 20.178545; 
     double longitude = 122.20; 
     double lat = 47.37; 
     float speed = (float) 65.4587; 
     long time = System.currentTimeMillis(); 
     LocationPackage locations = new LocationPackage(id,heading,longitude, lat,speed, time); 


     cv.put(dbh.COLUMN_LOCATION_id, (String) locations.id); 
     cv.put(dbh.COLUMN_LOCATION_HEADING, (float) locations.heading); 
     cv.put(dbh.COLUMN_LOCATION_lat, (double) locations.latitude); 
     cv.put(dbh.COLUMN_LOCATION_SPEED, (float) locations.speed); 
     cv.put(dbh.COLUMN_LOCATION_long, (double) locations.longitude); 
     cv.put(dbh.COLUMN_LOCATION_TIMESTAMP, (long) locations.time); 


     testDB.insert(dbh.TABLE_LOCATION, null, cv); 



     String selectQuery = "SELECT * FROM " + dbh.TABLE_LOCATION; 
     Log.i(dbh.toString(), selectQuery); 
     Cursor c = readDB.rawQuery(selectQuery, null); 
     if(c!=null) 
      c.moveToFirst(); 

     String locID = c.getString(c.getColumnIndex(dbh.COLUMN_LOCATION_id)); 

     //Log.i("LocationID: ", locID); 
     assertEquals(locID, "userid"); 


     //assertTrue(insertID != -1); 
    } 


    public void tearDown() throws Exception { 

     super.tearDown(); 

     //dbh.clearDatabase(); 
    } 

} 
+1

Bạn đã tìm thấy giải pháp về điều này chưa? –

Trả lời

0

Bạn quên mở cơ sở dữ liệu của mình. Làm dbh.open(). Sau đó đừng quên đóng db của bạn.

+1

Tôi nghĩ rằng đó là những gì testDB = dbh.getWritableDatabase() là nghĩa vụ phải làm gì? Thêm dbh.onOpen (testDB) hoặc dbh.onCreate (testDB) cũng truy cập Null. – MDM82

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