2016-09-15 60 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; 
    } 
}