2013-08-09 4 views
3

나는 안드로이드 애플리케이션을 가지고 있는데, 여기에서 a 버튼의 onCreate() 메소드는 onClick 메소드를 갖도록 정의되어 있습니다. 코드에서 :메소드 내에서 선언 된 메소드를 유닛 테스트하기

내 질문은
public void onCreate(Bundle savedInstanceState) { 
    /.../ 
     buttonSave = (Button) findViewById(R.id.store_button_save); 
     buttonSave.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       saveEditor(v); 
      } 
     });  
    /.../ 
} 

, 내가 안드로이드 단위 테스트에서 온 클릭()이 중첩 된 메소드를 호출 할 수있는 방법? onClick()이 활동 자체에 정의 된 메소드가 아니기 때문에 myActivity.onClick(myButton)이 작동하지 않습니다.

Btw, 내 테스트를 위해 원본 소스 코드를 변경해서는 안됩니다.

+0

click 이벤트를 buttonSave에 보내면 onClick 이벤트 처리기를 테스트 할 수 있습니다. – DwB

+0

@DwB : 어떻게 할 수 있습니까? –

답변

1

이러한 비정상 클래스를 만들지 않으면 테스트 할 수 있습니다.
대신 정상적인 내부 클래스를 생성하고 청취자에게로 새로운 인스턴스를 할당합니다

public static class MyClickListener implements OnClickListener { 
Editor editor; 
public MyClickListener(Editor e) { 
    this editor= e; 
} 
public void onClick(View v) { 
    editor.saveEditor(v); 
} 
} 

buttonSave.setOnClickListener(new MyClickListener()); 
public void testOnClickListener() { 
    Editor e = new Editor(); 
    MyClickListener l = new MyClickListener(e); 
    l.onClick(); 
    // however you check for correct result 
    assertTrue(checkSaveEditor(e)); 

    } 

JuniTest

에서

그런데 왜 단지 방법 saveEditor()만을위한 unitest를 작성하지? 이것으로 충분합니다. onClick()을 사용할 수 있습니다.

+0

원래 코드를 변경해야한다고 말합니까? 내 코드가 아니며 가능한 경우 수정하지 않는 것이 좋습니다. 다른 해결책이 있을까요? 없다면 솔루션의 예를 들어 줄 수 있습니까? 감사! –

+0

직접 단위 테스트로 테스트하려는 경우 다른 솔루션이 없습니다. 그러나 간단한 코드의 경우 항상 직접 테스트가 필요하지는 않습니다. 간접 테스트는 대안입니다 (onclick을 호출하여). 그리고 originsl 작성자가 테스트 가능성에 대해 언급하지 않았다면 코드를 개선해야합니다. – AlexWien

+0

확실히, 당신은 포인트를 만들고 있습니다. 답안에서 제안한 솔루션을 구현할 수있는 코드 예제를 제공해 주시겠습니까? –

0

onClick 메서드는 익명 클래스 내에 정의되어 있으므로 직접 호출 할 수 없습니다. 대신 외부 클래스에서 click 이벤트를 트리거해야합니다. 안드로이드 개발에 대해 많이 알지는 못하지만 다음 포스트에서는 ActivityManager를 사용하여 @UIthreadTest 주석으로 버튼 클릭을 시뮬레이션하는 것과 같은 시나리오를 테스트하는 방법에 대해 설명합니다. How to call Button.performClick in Android JUnit test case?

+0

입력 해 주셔서 감사합니다. 그러나 @UIthreadTest는 활동 테스트에 사용중인 ActivityUnitTestCase에 허용되지 않으므로 제공된 솔루션이 작동하지 않습니다. ActivityInstrumentationTestCase2에는 잘 작동하지만 테스트 클래스에는 다른 범위가 있습니다. –

관련 문제