【发布时间】:2018-04-30 11:38:40
【问题描述】:
我想知道是否可以使用带有 TestNG @BeforeMethod 注释的接口中的默认方法?
这是我尝试过的示例:
@Listeners(TestListener.class)
public interface ITestBase {
String baseUrl = Config.getProperty(Config.TEST_HOST);
String driverName = Config.getProperty(Config.BROWSER);
DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());
@BeforeMethod(alwaysRun = true)
default public void start() {
try {
driver.init();
DriverUnit.preconfigureDriver(Driver.driver.get());
driver.get().manage().deleteAllCookies();
driver.get().get(baseUrl);
} catch (TimeoutException e) {
Logger.logEnvironment("QT application is not available");
}
}
@AfterMethod(alwaysRun = true)
default public void end() {
if (driver.get() != null) {
try {
driver.get().quit();
} catch (UnreachableBrowserException e) {
Logger.logDebug("UnreachableBrowser on close");
} finally {
driver.remove();
}
}
}
当我运行典型的 TestNG 测试方法时,例如:
public class AppUiDemo implements ITestBase {
@Test(enabled = true)
public void checkWebDriverCreation() {
...
}
start() 和 end() 方法不会被调用。没有为测试执行创建驱动程序实例。
是否可以使用default 方法和TestNG 方法制作类似的东西?
如果我将接口更改为常规类,则调用前后方法(驱动程序实例创建良好):
public class TestBase {
protected final String baseUrl = Config.getProperty(Config.TEST_HOST);
protected final String driverName = Config.getProperty(Config.BROWSER);
protected final DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());
@BeforeMethod(alwaysRun = true)
public void start() {
....
问题是我的测试类已经在扩展另一个类:
public class MainTest extends ExecutionContext
因此我无法扩展TestBase。
是否可以在测试方法前后使用任何实现的接口来执行代码?
【问题讨论】:
-
我不关注。我在您的界面中看到了一些
static方法,但没有看到默认方法。我还在您的界面中看到非static、非final字段,那么给出了什么? “它不起作用”是指“它无法编译”吗?因为不,它不会。 -
@JohnBollinger 我修正了错字。我也尝试过静态方法。
-
@JohnBollinger 你错了。我愿意。此外,
String baseUrl默认为public static final。并键入类似的内容不是强制性的。在我看来,它是多余的,并且使可读性变得更加困难。
标签: java selenium-webdriver java-8 testng default-method