지난 며칠간 나는 roboguice, robolectric 및 mockito로 놀기 시작했습니다. 나는 사용자 이름을 빨리 입력하기 위해 AutoCompleteTextView가 포함 된 로그인 화면이있는 작은 안드로이드 응용 프로그램을 가지고 있습니다. AutoCompleteTextView의 사용자 이름은 sqlite-database에 저장됩니다.
Robolectric을 사용하여 활동을 테스트하는 동안 SQLite 데이터베이스 조롱
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));
}
...
}
나는 MainActivity가 mockito으로 데이터베이스를 조롱하려고 robolectric를 사용하여 테스트 할. 이 내 테스트 클래스입니다 : mainActivity.onCreate (널)를 호출
@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);
}
}
; 오류 캐스케이드가 시작되고 커서에서 끝납니다. cursor = db.rawQuery (SQL_QUERY, null); 내 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;
}
나는 모의 무효-방법의 빈 스텁을 반환하고 다른 방법에 null이 반환되어, 읽어 보시기 바랍니다. 내가 SQLiteDBAdapter 클래스를 조롱하고 있기 때문에 조롱 된 SQLiteDBAdapter에서 getUserList를 호출하면 null이 반환 될 것으로 예상됩니다. 내가 원래의 방법에 접근하고있는 이유는 분명하지 않습니다. 나는 그것이 원래 SQLiteDBAdapter를 사용하고 Mock은 사용하지 않고 있다고 생각한다. 이 문제를 해결하려면 무엇을해야하며 어떻게 작동합니까? 나는 아이디어가 없어서 도움이된다.
로그인 활동을 테스트하고 싶습니다. 이 활동은 데이터베이스를 사용하여 AutoCompleteTextview에 대한 userList를 가져옵니다. 데이터베이스를 모의로 대체하려고하므로 데이터베이스에 의존하지 않고 로그인 활동 (버튼 등)을 테스트 할 수 있습니다. 나는 몇 일 동안 robolectric와 mockito를 가지고 놀고 있기 때문에 좋은 버튼과 EditText를 테스트하는 것을 고려했다. – Frank
OK, 다른 점은 UI 테스트입니다. DAO 테스트를 이미 마친 것으로 가정하므로 서비스에 대한 의견이 나에게 도움이됩니다. – duffymo
제 3 자 코드를 조롱하면 전 세계에서 모든 의미를 갖게됩니다. 왜 다른 사람의 코드를 테스트할까요? 그리고 왜 당신은 실제로 데이터베이스를 가지고있는 오버 헤드를 원합니 까? DAO를 테스트 할 때 데이터베이스 또는 드라이버 기능이 예상대로 작동하는지 테스트하지 않으면 데이터베이스와의 상호 작용이 예상대로 이루어지는 지 테스트하고 있습니다. 이것은 정확히 모의을위한 것입니다. 예를 들어 중복 된 업데이트는 실제 DB를 공격 할 때 발견되지는 않지만 일반적으로 예상되거나 필요하지는 않습니다. 이것은 모의로 밝혀졌습니다. 불행히도 당신은 모의 객체를 제어 할 수 없으므로 추상화가 유일한 방법입니다. –