2013-04-10 3 views
7

지난 며칠간 나는 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은 사용하지 않고 있다고 생각한다. 이 문제를 해결하려면 무엇을해야하며 어떻게 작동합니까? 나는 아이디어가 없어서 도움이된다.

답변

2

DAO를 테스트하기 위해 데이터베이스를 조롱하면 전혀 이해가되지 않습니다. 너는 무엇을 테스트하고 있는가? 데이터베이스. 왜 그것을 제거합니까?

데이터베이스를 조롱하면 모든 DAO 테스트가 끝나고 사용자가 작업 단위를 수행하는 데 필요한 서비스를 테스트해야합니다. 이미 DAO와 데이터베이스를 테스트했으며 서비스 단위 테스트가 통합 테스트 일 필요는 없습니다. 이 경우에는 꼭 조롱하십시오.

내가 조롱하는 제품에 대해 많이 알지는 못하지만, 제 모의시에는 제 인터페이스의 인터페이스를 위시한 것입니다. mock은 내 클라이언트/테스트에서 사용하는 인터페이스 유형 참조에 대한 스탠드 - 인 구현을 제공합니다.

구체적인 클래스를 조롱하려는 경우 해당 어댑터를 인터페이스 기반 구현 안에 배치하는 것이 좋습니다. 더 나은 추상화가 될 것이고 인터페이스를 조롱하는 것이 더 쉬울 것입니다.

+0

로그인 활동을 테스트하고 싶습니다. 이 활동은 데이터베이스를 사용하여 AutoCompleteTextview에 대한 userList를 가져옵니다. 데이터베이스를 모의로 대체하려고하므로 데이터베이스에 의존하지 않고 로그인 활동 (버튼 등)을 테스트 할 수 있습니다. 나는 몇 일 동안 robolectric와 mockito를 가지고 놀고 있기 때문에 좋은 버튼과 EditText를 테스트하는 것을 고려했다. – Frank

+0

OK, 다른 점은 UI 테스트입니다. DAO 테스트를 이미 마친 것으로 가정하므로 서비스에 대한 의견이 나에게 도움이됩니다. – duffymo

+0

제 3 자 코드를 조롱하면 전 세계에서 모든 의미를 갖게됩니다. 왜 다른 사람의 코드를 테스트할까요? 그리고 왜 당신은 실제로 데이터베이스를 가지고있는 오버 헤드를 원합니 까? DAO를 테스트 할 때 데이터베이스 또는 드라이버 기능이 예상대로 작동하는지 테스트하지 않으면 데이터베이스와의 상호 작용이 예상대로 이루어지는 지 테스트하고 있습니다. 이것은 정확히 모의을위한 것입니다. 예를 들어 중복 된 업데이트는 실제 DB를 공격 할 때 발견되지는 않지만 일반적으로 예상되거나 필요하지는 않습니다. 이것은 모의로 밝혀졌습니다. 불행히도 당신은 모의 객체를 제어 할 수 없으므로 추상화가 유일한 방법입니다. –

관련 문제