2013-04-10 9 views
7

के साथ गतिविधि का परीक्षण करते समय SQLite- डेटाबेस का मज़ाक उड़ाते हुए पिछले कुछ दिनों में मैंने roboguice, robolectric और mockito के साथ खेलना शुरू कर दिया। मेरे पास उपयोगकर्ता नाम में तेजी से प्रवेश करने के लिए एक ऑटोकंपलेटटेक्स्टव्यू युक्त लॉगिन-स्क्रीन वाला एक छोटा एंड्रॉइड एप्लिकेशन है। AutoCompleteTextView के उपयोगकर्ता नाम एक SQLite-डेटाबेस में संग्रहीत हैं।
Robolectric

public class MainActivity extends RoboActivity implements View.OnClickListener { 
@InjectView(R.id.startScreen_Login_Button) private Button loginButton; 
@InjectView(R.id.startScreen_Cancel_Button) private Button cancelButton; 
@InjectView(R.id.startScreen_forgotPwd_TextView) private TextView forgotPWTextView; 
@InjectView(R.id.startScreen_Username_AutoCompleteTextView) private AutoCompleteTextView loginUsernameAutoCompleteTextView; 
@InjectView(R.id.startScreen_Password_EditText) private EditText loginPasswordEditText; 
@Inject private SharedPreferences sharedPreferences; 
@Inject SQLiteDBAdapter dbAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    loginButton.setOnClickListener(this); 
    cancelButton.setOnClickListener(this); 
    forgotPWTextView.setOnClickListener(this); 

    // Creating List for startScreen_Username_AutoCompleteTextView 
    List<User> userList = dbAdapter.getUserList(); 
    ListIterator<User> it = userList.listIterator(); 
    List<String> userStringList = new ArrayList<String>(); 
    User user; 
    while (it.hasNext()) { 
     user = it.next(); 
     userStringList.add(user.getName()); 
    } 

    loginUsernameAutoCompleteTextView.setAdapter(new ArrayAdapter<String>(this, R.layout.select_page_row, userStringList)); 
    } 
... 
} 

मैं robolectric का उपयोग कर MainActivity, mockito साथ डेटाबेस उपहास करने के लिए कोशिश कर रहा है परीक्षण करना चाहते हैं। यह मेरा परीक्षण स्तरीय है:

@RunWith(CustomRobolectricTestRunner.class) 
public class MainActivityTest { 

@Mock 
SQLiteDBAdapter dbAdapter; 

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void shouldHaveApplicationName() throws Exception { 
    String appName = new MainActivity().getResources().getString(R.string.app_name); 
    assertThat(appName, equalTo("OperationReport")); 
} 

@Test 
public void testButtonsVisible() 
{ 
    MainActivity mainActivity = new MainActivity(); 
    mainActivity.onCreate(null); 
} 
} 

mainActivity.onCreate (शून्य) कॉलिंग; त्रुटि कर्सर शुरू हो रहा है, लाइन कर्सर कर्सर = db.rawQuery (SQL_QUERY, शून्य) में समाप्त हो रहा है; मेरी SQLiteDBAdapter में मेरी getUserList-विधि की:

public List<User> getUserList() { 
    SQLiteDatabase db = getReadableDatabase(); 
    List<User> userList = new ArrayList<User>(); 

    String SQL_QUERY = "SELECT * FROM User;"; 
    Cursor cursor = db.rawQuery(SQL_QUERY, null); 
    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     User user = new User(); 
     user.setUserUUID(cursor.getString(0)); 
     user.setName(cursor.getString(1)); 
     user.setPassword(cursor.getString(2)); 
     user.setDateOfBirth(cursor.getString(3)); 
     user.setStaffNumber(cursor.getString(4)); 
     user.setActive(cursor.getInt(5)); 
     user.setUserClass(cursor.getInt(6)); 
     userList.add(user); 
     cursor.moveToNext(); 
    } 
    cursor.close(); 
    db.close(); 
    return userList; 
} 

मैंने पढ़ा है, कि एक नकली शून्य-तरीकों में से खाली स्टब्स लौटा रहा है, और किसी अन्य विधि पर अशक्त देता है। चूंकि मैं SQLiteDBAdapter-class का मज़ाक उड़ा रहा हूं, मुझे उम्मीद है कि मेरे मॉक किए गए SQLiteDBAdapter पर कॉलिंग getUserList को वापस लौटाएगा। यह मेरे लिए बिल्कुल स्पष्ट नहीं है, वह मूल विधि का उपयोग क्यों कर रहा है। मुझे लगता है कि यह अभी भी मूल SQLiteDBAdapter का उपयोग कर रहा है, न कि मॉक। इसे ठीक करने के लिए मुझे क्या करना है, और यह कैसे काम कर रहा है? मैं विचारों से बाहर भाग गया, इसलिए किसी भी मदद की सराहना की है।

उत्तर

2

डीएओ का परीक्षण करने के लिए डेटाबेस को मॉक करने से मुझे कोई समझ नहीं आता है। आप क्या परीक्षण कर रहे हैं डेटाबेस। इसे खत्म क्यों करें?

आपके सभी डीएओ परीक्षण पास होने के बाद डेटाबेस का मज़ाक उड़ाता है और यह सेवा का परीक्षण करने का समय है जो उपयोगकर्ता इसे काम की इकाई को पूरा करने के लिए करते हैं। आपने पहले ही डीएओ और डेटाबेस का परीक्षण किया है, और आपकी सेवा इकाई परीक्षण को एकीकरण परीक्षण की आवश्यकता नहीं है। हर तरह से उस मामले में मजाक कर।

मुझे आप जो मजाक कर रहे हैं उसके बारे में बहुत कुछ नहीं पता, लेकिन जब मैं इसे बनाने के इंटरफेस के लिए मजाक करता हूं। नकली इंटरफ़ेस-टाइप किए गए संदर्भ के लिए एक स्टैंड-इन कार्यान्वयन प्रदान करता है जो मेरा ग्राहक/परीक्षण उपयोग कर रहा है।

यदि आप एक ठोस वर्ग का नकल करने की कोशिश कर रहे हैं तो मैं उस एडाप्टर को इंटरफ़ेस-आधारित कार्यान्वयन के अंदर लपेटने की अनुशंसा करता हूं। यह एक बेहतर अमूर्त होगा और आपके इंटरफ़ेस का मज़ाक उड़ाएंगे।

+0

मैं अपनी लॉगिन-गतिविधि का परीक्षण करना चाहता हूं। यह गतिविधि AutoCompleteTextview के लिए उपयोगकर्ता सूची प्राप्त करने के लिए डेटाबेस का उपयोग कर रही है। मैं डेटाबेस को एक मॉक के साथ बदलना चाहता हूं, इसलिए मैं डेटाबेस पर निर्भर किए बिना लॉगिन-गतिविधि (बटन, आदि) का परीक्षण कर सकता हूं। मैंने कुछ बटनों और एडिटटेक्स्ट को एक अच्छा अभ्यास परीक्षण करने पर विचार किया, क्योंकि मैं कुछ दिनों के लिए रोबलेक्ट्रिक और मॉकिटो के साथ खेल रहा हूं। – Frank

+0

ठीक है, यह अलग है - आप यूआई का परीक्षण कर रहे हैं। मुझे लगता है कि आपने पहले ही डीएओ का परीक्षण किया है, इसलिए सेवा के बारे में मेरी टिप्पणियां आपके लिए हैं। – duffymo

+0

तीसरे पक्ष कोड का मज़ाक उड़ाते हुए दुनिया में सभी भावनाएं मुझे बनाती हैं। आप किसी और के कोड का परीक्षण क्यों करेंगे? और आप वास्तव में डेटाबेस के ओवरहेड क्यों चाहते हैं। जब आप डीएओ का परीक्षण करते हैं तो आप परीक्षण नहीं कर रहे हैं कि डेटाबेस या उसके ड्राइवर कार्य अपेक्षा करते हैं, आप परीक्षण कर रहे हैं कि डेटाबेस के साथ आपकी बातचीत की अपेक्षा है। यह वही है जो एक नकली है। उदाहरण के लिए वास्तविक डीबी मारते समय डुप्लिकेट अपडेट अनदेखा नहीं होते हैं, लेकिन आम तौर पर अपेक्षित या इच्छित नहीं होते हैं। यह एक नकली द्वारा खुलासा है। दुर्भाग्य से आप जो मजाकिया है उसे नियंत्रित नहीं कर सकते हैं, इसलिए अमूर्त एकमात्र तरीका है। –

संबंधित मुद्दे