2011-02-06 5 views
1

궁극적으로 사용자 정의 기본 어댑터를 단위 테스트하려고하는데 한 순간에 멈추었습니다. 방금 전달한 메시지를 처리하기 위해 UI 스레드를 얻는 방법을 파악할 수 없습니다. sendEmptyMessage(...) . 내 활동에단위 테스트 처리기

나는 배열을 업데이트하는 "addFoo(Foo foo)"방법을 가지고 다음 "sendEmptyMessage(1)"을 호출하고, 나는 데이터가 변경을 말할의 ListView의 어댑터를 호출하는 handleMessage 방법이있다.

나는 약, 단위 테스트 아래에 삶은했습니다

public void testAddFoo() { 
    Foo foo = new Foo(); 
    assertTrue(mActivity.addFoo(foo)); 
    assertTrue(mActivity.getHandler().hasMessages(1)); 
    assertFalse(mActivity.getHandler().hasMessages(1)); 
    assertTrue(mActivity.fooListNotEmpty()); 
} 

는 당연히이에 실패하는 assertFalse() (이 최선 내가 할 수있는 그것을 단순화, 인위적인 예입니다).

모든 보류중인 메시지를 처리하기 위해 mActivity 또는 처리기 또는 루퍼를 호출하려면 어떻게해야합니까? UI 스레드 내에서 Looper.loop()을 호출하는 것에 대해 읽은 몇 가지 제안을 시도했지만 어둠 속에서 찌르다가 실패했습니다.

@UiThreadTest 
public void testAddFoo() { 
    Foo foo = new Foo(); 
    assertTrue(mActivity.addFoo(foo)); 
    Message msg = Message.obtain(); 
    msg.what = 1; 
    mActivity.handleMessage(msg); 
    assertTrue(mActivity.fooListNotEmpty()); 
} 

테스트가 예상대로 작동 끝 :

FWIW, 나는 내가 지금처럼 (@UiThreadTest 내부에) 직접 호출하는 경우 때문에 handleMessage 코드가 올바른지 확신합니다.

+0

처리기를 설정하는 코드를 게시 할 수 있습니까? – techiServices

+0

@sugarynygs : 핸들러는 "mHandler = new Handler();"로 설정됩니다. "공용 클래스 FooActivity extends Activity extends Handler.Callback"으로 선언 된 활동 내부. mHandler는 "public Handler getHandler() {return mHandler;}" –

+0

"을 통해 JUnit에서 사용할 수있게되었습니다. 여러분이 명시 적으로 새로운 Handler와 Handler.Callback을 구현하고 있다는 점에서 맞습니까? – techiServices

답변

1

당신이 그렇지 않으면 콜백을 구현하고 활동하는 경우

mHandler = new Handler() { 

// override Handler methods as required 
// ie handleMessage(Message msg) 

}; 

assertTrue(mActivity.mHandler.hasMessages(1)); 
+0

맞습니다. 콜백 인터페이스를 사용하지 않고 멤버 처리기로 이동하면 메시지를 쉽게 테스트 할 수 있습니다. 메시지가 실제로 처리 될 수있는 후드에서 어떤 부도가 발생하고 있는지 확신 할 수 없지만, 지금은 "그것이 발생합니다"라고 받아 들여야 할 것입니다. 감사. –

+0

안녕하십니까? 관심이 없다면 True (mActivity.hasMessages (1)); Handler를 구현할 때 작동하지 않습니다. 콜백? – techiServices

2

를 사용하지 않는 다음 방금

assertTrue(mActivity.hasMessages(1)); 

을해야 활동에 Handler.Callback을 구현하는 경우 Handler.Callback을 구현하고 h에 메시지를 표시하려고합니다. andleMessage 메소드를 사용하면 onCreate에서 핸들러를 초기화 할 때 액티비티를 전달해야합니다.

mHandler = new Handler(this); 

은 당신이 작업 회원 핸들러 접근 방식을 가지고 알아,하지만 난 Handler.Callback 인터페이스 방식이 작동하는 방법을 알아 내려고 여기에 표시 나 같은 사람들을 위해이 추가 해요.