2012-03-01 119 views
1

在我的應用程序中,我將XML文件的內容解析爲兩個數組。在我的單元測試中,如何從測試活動中獲取這些ArrayLists,以便我可以測試它們是否正確,例如正確的長度和內容是否正確?我現在使用的方法數組總是空,儘管我知道解析工作正常。 (解析方法稱爲被測活動的onCreate()方法。)單元測試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()'填充,它們應該有值。他們在'@之前'嗎?儘管如此,我不喜歡你在'setUp'中完成所有工作的方式;海事組織的測試應該針對實例運行,並且所有的設置都應該實例化並調用onCreate。 – 2012-03-01 17:36:01

+0

是的,它們是靜態的,並由onCreate()填充。我正在關注Android Activity測試教程,它可以完成setUp中的所有工作。 – user 2012-03-01 19:44:52

+0

它看起來像TroubleShooterActivity真的返回null。我們需要一些TroubleShooterActivity的代碼來幫助你。 – 2012-03-01 20:07:31

回答

0

代碼我會檢查是否有被抓隱藏起來,變成一個異常捕捉期間的Toast調用(例外e)。我不確定Robolectric完全初始化您的資源,以便您可以進行此調用:getResources()。openRawResource()

如果要隔離xml解析代碼並完全測試它及其結果,可以考慮移動解析將你的活動編碼到自己的類中。這樣你甚至不需要利用robolectric來運行你的測試。

作爲一個方面說明,你確定static是一個適合你的變量的修飾符嗎?我認爲在這種情況下非靜態應該工作得很好。