2016-09-15 67 views
1

比方說,我有這些方法如何防止的方法被稱爲不止一次

public class AuthProvider { 
    protected AWSCredentials obtainAuth() { 
     AWSCredentials credentials = new BasicAWSCredentials("key1", ""); 
     return credentials; 
    } 
} 

public class Uploader extends AuthProvider { 
    public void uploadFile() { 
     obtainAuth(); 
     //code to upload file 
    } 
} 

然後,我有我的TestNg測試類,如下

public class T1 { 
    @Test 
    public void runTest1() { 
     Uploader uploader = new Uploader(); 
     uploader.uploadFile(); 
    } 
} 

public class T2 { 
    @Test 
    public void runTest1() { 
     Uploader uploader = new Uploader(); 
     uploader.uploadFile(); 
    } 
} 

現在,如果我跑T1T2作爲測試套件的一部分,它將運行obtainAuth()方法兩次(一次在T1和一次在T2)。由於我將兩個測試作爲同一個套件的一部分運行,因此它應該只運行obtainAuth()方法並以static的方式存儲返回的值AWSCredentials

我試圖通過在Uploader類中聲明靜態類級別字段以static的方式實例化obtainAuth()。但它沒有奏效。

+0

Depends中在測試框架中,但它們通常具有setUp()方法,該方法在套件中的第一個測試之前運行,而在suite中的最後一個測試之後運行tearDown()方法。嘗試在你的測試框架的文檔中查找setup/teardown。 – Ma3x

+0

我在'beforeSuite()'中加入了它。有用。但我想用其他方式解決它? –

+0

當然,如果你想在應用程序中防止多次調用,你可以在應用程序代碼中解決這個問題。 – Ma3x

回答

1

基本上你添加一個抽象。什麼阻止你將支票放入你的AuthProvider中,檢查它是否已經完成了它的工作?

換句話說:重做你的方法以允許多次調用;但只有第一個做一些事情;其他都是空操作:或者更簡單:

public class AuthProvider { 
    private static final AWSCredentials credentials = new BasicAWSCredentials("key1", ""); 

    protected AWSCredentials obtainAuth() { 
    return credentials; 
    } 

但好,你會作出靜態整個事情阻礙然後...

+0

你的意思是初始化變量並執行一個'null'檢查? –

+0

甚至沒有空檢查。無論如何,我想一個電話應該會發生。請記住,惰性init是一種**優化**的形式;因此可能是不成熟的並且沒有幫助。 – GhostCat

+0

謝謝,並且合理。早些時候,當我在一個課程中擁有所有內容時,我的意思是同一個課程中的認證和上傳器,我將auth靜態化,而'testng'因爲某些原因不喜歡它。我不知道爲什麼。現在我把它分開了,效果很好 –

0

你爲什麼不這樣做

public class AuthProvider { 
    private static AWSCredentials credentials = new BasicAWSCredentials("key1", ""); 
    protected AWSCredentials obtainAuth() { 
     return credentials; 
    } 
}