运行Android测试setUp()方法被多次调用

时间:2013-02-05 21:35:07

标签: java android eclipse junit4

我正在为我的Android应用程序创建一个测试套件并拥有这个setUp方法

    private static final String TAG_NAME = "TESTING_SUITE";
        public TestingMusicDAO musicDAO;
        public List<Song> songs;
        public Instrumentation instr;
        MusicService musicService;
    @Override
    public void setUp() throws Exception {
        instr = this.getInstrumentation();
        Log.d(TAG_NAME, "Setting up testing songs");
        musicDAO = new TestingMusicDAO(instr.getContext());
        musicService = new MusicServiceImpl(musicDAO);
        musicDAO.getAllSongsFromFile();
        songs = musicDAO.getAllSongs();
        for(Song song : songs)
            Log.d( TAG_NAME, song.toString() );
     }

然后让这些测试由python工具从文本文件

创建
public void test1() {
    List<Song> testPlaylist;
    String testArtist = ("The Beatles");
    String actualArtist = ("TheBeatles"); 
    testPlaylist = testingPlaySongsByKeyword(testArtist);
    if(testPlaylist.isEmpty()){
        fail("No Songs Were Found");
    } else {
        for( Song loopsongs : testPlaylist){
            if (!(loopsongs.getArtist().equals(actualArtist))){
                fail("Song Doesnt Contain the artist" + actualArtist + "... Contains ->" + loopsongs.getArtist());
            }
        }
   }
}

每当其中一个被调用时,musicDAO就会被重新生成。如何停止调用设置方法

3 个答案:

答案 0 :(得分:5)

你没有。 JUnit的设计是setUp()tearDown()每次测试完成一次。如果您希望每个类完成它,请在构造函数中完成。只要确保你不改变课程内的任何内容。每次测试一次这样做的原因是为了确保所有测试都以相同的数据开始。

答案 1 :(得分:2)

您可以使用JUnit中的@BeforeClass@AfterClass注释。

@BeforeClass
public static void test_setUp_Once(){
  // Code which you want to be executed only once
  createDb();
}

@AfterClass
public static void test_tearDown_Once(){
  // Code which you want to be executed only once
  deleteDb();
}

注意:您需要声明这些方法static才能正常工作。

答案 2 :(得分:0)

我有同样的基本问题。我希望能够测试我的数据库的结构,所以我在setUp方法中创建它并在tearDown中删除它。使用构造函数无法解决我在执行所有测试后删除数据库的需要,因此我使用了一些可重入逻辑:

static int testsExecutedSoFar = 0;
static boolean isFirstRun = true;

@Override
protected void setUp() throws Exception {
    if(isFirstRun){
        createDb();
        isFirstRun = false;
    }       
}

@Override
protected void tearDown() throws Exception{
    testsExecutedSoFar++;
    if (testsExecutedSoFar == totalNumberOfTestCases())
        deleteDb();     
}

private int totalNumberOfTestCases() {
    return countTestCases()+1; //have to add one for testandroidtestcasesetupproperly added by AndroidTestCase
}

字段必须是静态的,因为JUnit为每次运行创建了一个类的新实例。因为AndroidTestCase将自己的测试(testandroidtestcasesetupproperly)添加到测试套件中,所以必须添加魔法1,但它不计入countTestCases()返回的数字。

丑陋的一面,但它做到了伎俩。