Java 如何将功能对象传递给TestNG ITestlistener(或在类中引用ITestlistener方法)?

Java 如何将功能对象传递给TestNG ITestlistener(或在类中引用ITestlistener方法)?,java,selenium,listener,testng,saucelabs,Java,Selenium,Listener,Testng,Saucelabs,我们目前正在使用硒、TestNG和Saucelabs。我试图覆盖onTestSuccess和onTestFailure侦听器方法,以便根据方法的结果将功能设置为true/false 我试过几种方法都没有成功。简要总结: MainSauceLabsClass.java public class MainSauceLabsClass { // ..... public static DesiredCapablities desiredCapabilities; // ....

我们目前正在使用硒、TestNG和Saucelabs。我试图覆盖
onTestSuccess
onTestFailure
侦听器方法,以便根据方法的结果将功能设置为
true/false

我试过几种方法都没有成功。简要总结:

MainSauceLabsClass.java

public class MainSauceLabsClass {
    // .....
    public static DesiredCapablities desiredCapabilities;
    // ....
    @BeforeMethod 
    //set a whole range of parameters for Saucelabs here,e.g.:
    desiredCapabilities = DesiredCapabilities.iphone();
    desiredCapabilities.setCapabilities("idleTimeout",300);
    // etc...
}
public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        // I want to pass to saucelabs pass/fail result via "passed" capability. something like 
        // desiredCapabilities.setCapabilities("passed",true);
    }
}
@Listeners(CustomTestListener.class)
public class MainSauceLabsClass {
    public static final ThreadLocal<DesiredCapabilities> CURRENT_DESIRED_CAPABILITIES =
            new InheritableThreadLocal<>();

    @BeforeMethod
    public void setDesiredCapabilities() {
        DesiredCapabilities desiredCapabilities = DesiredCapabilities.iphone();
        desiredCapabilities.setCapability("idleTimeout", 300);
        CURRENT_DESIRED_CAPABILITIES.set(desiredCapabilities);
    }
}
public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        DesiredCapabilities desiredCapabilities =
                MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
        desiredCapabilities.setCapability("passed", true);
    }
}
CustomTestListener.java

public class MainSauceLabsClass {
    // .....
    public static DesiredCapablities desiredCapabilities;
    // ....
    @BeforeMethod 
    //set a whole range of parameters for Saucelabs here,e.g.:
    desiredCapabilities = DesiredCapabilities.iphone();
    desiredCapabilities.setCapabilities("idleTimeout",300);
    // etc...
}
public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        // I want to pass to saucelabs pass/fail result via "passed" capability. something like 
        // desiredCapabilities.setCapabilities("passed",true);
    }
}
@Listeners(CustomTestListener.class)
public class MainSauceLabsClass {
    public static final ThreadLocal<DesiredCapabilities> CURRENT_DESIRED_CAPABILITIES =
            new InheritableThreadLocal<>();

    @BeforeMethod
    public void setDesiredCapabilities() {
        DesiredCapabilities desiredCapabilities = DesiredCapabilities.iphone();
        desiredCapabilities.setCapability("idleTimeout", 300);
        CURRENT_DESIRED_CAPABILITIES.set(desiredCapabilities);
    }
}
public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        DesiredCapabilities desiredCapabilities =
                MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
        desiredCapabilities.setCapability("passed", true);
    }
}
显然,问题是我无法在
CustomTestListener.java
中引用对象
desiredCapabilities
,因为它是在
MainSauceLabsClass
中设置的。我的问题是,实施这一计划的最佳方式是什么。要么:

  • CustomTestListener
    中以某种方式引用相同的
    desiredCapabilities
    对象来调用
    setCapabilities
    方法
  • MainSauceLabsClass
    中访问
    onTestSuccess
    ,并在
    @AfterMethod
    中设置它,以便可以在同一类中引用
    所需的功能
  • 替代方案
如有需要,乐意提供更多信息。感谢您的帮助

显然,问题是我无法在
CustomTestListener.java
中引用对象
desiredCapabilities
,因为它是在
MainSauceLabsClass
中设置的

由于您的
desiredCapabilities
是一个
公共静态
变量,因此您可以从
CustomTestListener
中“引用”它。e、 g:

public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        MainSauceLabsClass.desiredCapabilities.setCapabilities("passed",true);
    }
}
但是,如果在
MainSauceLabsClass
中的
@before方法
之前调用
CustomTestListener.onTestSuccess(ITestResult)
,则您将得到一个
NullPointerException
(这可能就是您所说的“无法引用……因为它是在
MainSauceLabsClass
中设置的”)

如果您正在尝试存储与每个测试相关联的数据,那么您可以在每个测试及其配置(before/after)方法在各自的线程中运行时使用。然后可以设置并获取当前测试的值。e、 g:

MainSauceLabsClass.java

public class MainSauceLabsClass {
    // .....
    public static DesiredCapablities desiredCapabilities;
    // ....
    @BeforeMethod 
    //set a whole range of parameters for Saucelabs here,e.g.:
    desiredCapabilities = DesiredCapabilities.iphone();
    desiredCapabilities.setCapabilities("idleTimeout",300);
    // etc...
}
public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        // I want to pass to saucelabs pass/fail result via "passed" capability. something like 
        // desiredCapabilities.setCapabilities("passed",true);
    }
}
@Listeners(CustomTestListener.class)
public class MainSauceLabsClass {
    public static final ThreadLocal<DesiredCapabilities> CURRENT_DESIRED_CAPABILITIES =
            new InheritableThreadLocal<>();

    @BeforeMethod
    public void setDesiredCapabilities() {
        DesiredCapabilities desiredCapabilities = DesiredCapabilities.iphone();
        desiredCapabilities.setCapability("idleTimeout", 300);
        CURRENT_DESIRED_CAPABILITIES.set(desiredCapabilities);
    }
}
public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        DesiredCapabilities desiredCapabilities =
                MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
        desiredCapabilities.setCapability("passed", true);
    }
}

您已将DesiredCapabilities对象声明为public和static。那么,是什么阻止您使用该对象,如“MainSauceLabsClass.DesiredCapabilities”?在listener类内部