问题
Though the practice that I have been following could be inappropriate. Still looking for a fix to my problem here :
I'm getting a StackOverflowError ::
java.lang.StackOverflowError
at com.my.package.pages.Selendroid.HomePage.<init>(HomePage.java:11)
at com.my.package.pages.Selendroid.LoginPage.<init>(LoginPage.java:14)
at com.my.package.pages.Selendroid.HomePage.<init>(HomePage.java:11)
AppiumBasePage ::
public class AppiumBasePage {
protected AppiumDriver driver;
HomePage ::
public class HomePage extends AppiumBasePage {
LoginPage loginPage = new LoginPage();
LoginPage ::
public class LoginPage extends AppiumBasePage {
HomePage homePage = new HomePage();
Q : How do I resolve this cyclic dependency and what exactly am I doing wrong here? Details would be great.
Edit : The details to what I want to achieve is - I would be having a lot of interrelated methods in both these classes. And instead of creating an object inside the functions where I wanted to use it multiple times, I want to have a single object of one page on another to use the methods defined in the former.
回答1:
Your problem is that when you create a HomePage
it creates a new LoginPage
and whenever you create a LoginPage
you create a HomePage
. This will clearly result in a never ending (until the stack overflows) cycle.
To solve the problem, do not create the pages during construction. Make setter
s for them
private static class AppiumBasePage {
public AppiumBasePage() {
}
}
public class HomePage extends AppiumBasePage {
LoginPage loginPage;
public void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
}
public class LoginPage extends AppiumBasePage {
HomePage homePage;
public void setHomePage(HomePage homePage) {
this.homePage = homePage;
}
}
public void test() {
LoginPage login = new LoginPage();
HomePage home = new HomePage();
login.setHomePage(home);
home.setLoginPage(login);
}
Alternatively you could remove the interdependency entirely by introducing a new class to maintain that.
public class HomePage extends AppiumBasePage {
}
public class LoginPage extends AppiumBasePage {
}
class Pages {
AppiumBasePage login = new LoginPage();
AppiumBasePage home = new HomePage();
}
It all depends on what you need to achieve.
来源:https://stackoverflow.com/questions/34288021/circular-dependency-in-classes-and-stackoverflow-error