के साथ गतिविधि का परीक्षण करते समय 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 का उपयोग कर रहा है, न कि मॉक। इसे ठीक करने के लिए मुझे क्या करना है, और यह कैसे काम कर रहा है? मैं विचारों से बाहर भाग गया, इसलिए किसी भी मदद की सराहना की है।
मैं अपनी लॉगिन-गतिविधि का परीक्षण करना चाहता हूं। यह गतिविधि AutoCompleteTextview के लिए उपयोगकर्ता सूची प्राप्त करने के लिए डेटाबेस का उपयोग कर रही है। मैं डेटाबेस को एक मॉक के साथ बदलना चाहता हूं, इसलिए मैं डेटाबेस पर निर्भर किए बिना लॉगिन-गतिविधि (बटन, आदि) का परीक्षण कर सकता हूं। मैंने कुछ बटनों और एडिटटेक्स्ट को एक अच्छा अभ्यास परीक्षण करने पर विचार किया, क्योंकि मैं कुछ दिनों के लिए रोबलेक्ट्रिक और मॉकिटो के साथ खेल रहा हूं। – Frank
ठीक है, यह अलग है - आप यूआई का परीक्षण कर रहे हैं। मुझे लगता है कि आपने पहले ही डीएओ का परीक्षण किया है, इसलिए सेवा के बारे में मेरी टिप्पणियां आपके लिए हैं। – duffymo
तीसरे पक्ष कोड का मज़ाक उड़ाते हुए दुनिया में सभी भावनाएं मुझे बनाती हैं। आप किसी और के कोड का परीक्षण क्यों करेंगे? और आप वास्तव में डेटाबेस के ओवरहेड क्यों चाहते हैं। जब आप डीएओ का परीक्षण करते हैं तो आप परीक्षण नहीं कर रहे हैं कि डेटाबेस या उसके ड्राइवर कार्य अपेक्षा करते हैं, आप परीक्षण कर रहे हैं कि डेटाबेस के साथ आपकी बातचीत की अपेक्षा है। यह वही है जो एक नकली है। उदाहरण के लिए वास्तविक डीबी मारते समय डुप्लिकेट अपडेट अनदेखा नहीं होते हैं, लेकिन आम तौर पर अपेक्षित या इच्छित नहीं होते हैं। यह एक नकली द्वारा खुलासा है। दुर्भाग्य से आप जो मजाकिया है उसे नियंत्रित नहीं कर सकते हैं, इसलिए अमूर्त एकमात्र तरीका है। –