2012-03-01 3 views
1

В моем приложении я анализирую содержимое XML-файла на два массива. В моем модульном тесте, как я могу получить эти ArrayLists из тестируемой Activity, чтобы я мог протестировать их, например, правильную длину и правильность содержимого? С помощью метода, который я использую в данный момент, массивы всегда равны нулю, хотя я знаю, что синтаксический анализ работает правильно. (Метод синтаксического анализа вызывается в методе OnCreate() деятельности при испытании.)Unit testing ArrayList

@RunWith(RobolectricTestRunner.class) 

public class TroubleShooterActivityTest { 
private TroubleShooterActivity mActivity; 
private Button mButton; 
private TextView mTextView; 
private ImageView mLogo; 
private ArrayList<Page> mPageList; 
private ArrayList<Answer> mAnswerList; 
private int lengthPageArray = 7; 
private int lengthAnswerArray = 7; 

@Before  
public void setUp() throws Exception {   
    mActivity = new TroubleShooterActivity();   
    mActivity.onCreate(null);   
    mButton = (Button) mActivity.findViewById(R.id.troubleShooter); 
    mTextView = (TextView) mActivity.findViewById(R.id.title); 
    mLogo = (ImageView) mActivity.findViewById(R.id.IntegralLogo); 
    mPageList = TroubleShooterActivity.pageList; 
    mAnswerList = TroubleShooterActivity.answerList; 
    } 


@Test 
public void testPreconditions() { 
    assertNotNull(mTextView); 
    assertNotNull(mLogo); 
    assertNotNull(mButton); 
    assertNotNull(mPageList); 
    assertNotNull(mAnswerList); 
} 


    @Test 
public void testArraysWereFilledCorrectly(){ 
    assertEquals(mPageList.size(), lengthPageArray); 
    assertEquals(mAnswerList.size(), lengthAnswerArray); 
} 

код из TroubleShooterActivity

public class TroubleShooterActivity extends OptionMenu { 

/**Variables */ 
static ArrayList<Page> pageList; 
static ArrayList<Answer> answerList; 




    /** onCreate() is called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    parseXML(); 

    Button Select = (Button) findViewById(R.id.troubleShooter); 
    /** assign behaviour to button*/ 
    Select.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v) { 
      Intent intent = new Intent(TroubleShooterActivity.this,  Question.class); 
      intent.putExtra("NextPageID", 1); //Pass next page ID to Question class 
      startActivity(intent); 
     } 

    }); 


} 

public void parseXML(){ 
    try { 

     /** Try handling XML */ 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser parser = factory.newSAXParser(); 
     XMLReader xmlreader = parser.getXMLReader(); 

     /**Gets the input from the XML file stored in the res raw folder */ 

     InputSource is = new InputSource(getResources().openRawResource(R.raw.trouble_shooter_content)); 

     XMLHandler xmlHandler = new XMLHandler(); 

     /** assign our handler */ 
     xmlreader.setContentHandler(xmlHandler); 
     xmlreader.parse(new InputSource(is.getByteStream())); 


     pageList = XMLHandler.pageList; 
     answerList = XMLHandler.answerList; 


    } catch (Exception e) { 
     Toast.makeText(getApplicationContext(), e.getClass().getName() + " " + e.getMessage(), Toast.LENGTH_LONG).show(); 
     //Let the user know about the error 
    } 
} 
+2

Не зная больше, не знаете, как помочь - если они статичны и заполнены 'onCreate()', они должны иметь значения. Они в '@ Before'? Мне не нравится, как вы все делаете в 'setUp'; IMO тесты должны работать против экземпляра, и вся настройка должна выполняться, это создать экземпляр и вызвать onCreate. –

+0

Да, они статичны и заполнены функцией onCreate(). Я следил за учебником по тестированию активности Android, который делает все, что работает в setUp. – user

+0

Похоже, что TroubleShooterActivity действительно возвращает null. Нам нужен код TroubleShooterActivity, чтобы помочь вам. –

ответ

0

Я хотел бы проверить, если есть исключение поимки и спрятан в ваш вызов Toast во время улова (Исключение e). Я не уверен, что Robolectric полностью инициализирует ваши ресурсы, чтобы вы могли сделать этот вызов: getResources(). OpenRawResource()

Если вы хотите изолировать XML-код синтаксического анализа и полностью протестировать его и его результаты, вы можете подумать о переносе разбора кода из вашей деятельности в свой класс. Таким образом, вам даже не нужно использовать robolectric для запуска ваших тестов.

В качестве побочного примечания вы уверены, что статический фильтр является подходящим модификатором для ваших переменных? Я думаю, что нестатический должен работать в этом случае просто отлично.