How to use generalized object for 2 different classes?
How to use generalized object for 2 different classes?
I have 2 component classes
OrderDetailsSite1.java
OrderDetailsSite2.java
I have one bean class where I'm storing the Shopping cart details
Now I have to create one common method where I have to pass the Component class Object and compare the values with, bean class data.
Code trial :
public void validateProductDetails(Object obj)
OrderDetailBean bean = (OrderDetailBean) ConfigurationManager.getBundle().getObject("order_details");
OrderDetailsSite1 comp=null;
if (obj instanceof OrderDetailsSite1)
comp = (OrderDetailsSite1) obj;
for (int i = 0; i < bean.getProductName().size(); i++)
assertResult( comp.getProductList().get(i).getProductName().getText(), bean.getProductName().get(i));
assertResult( comp.getProductList().get(i).getProductQuantity().getText(), bean.getProductQuantity().get(i));
assertResult( comp.getProductList().get(i).getProductUnitPrice().getText(), bean.getProductUnitprice().get(i));
assertResult(comp.getProductList().get(i).getProductSubtotal().getText(), bean.getProductSubtotal().get(i));
The code what i have done for component 1 but for component 2 do i need to repeat the same code ? or is there any provision to do the same in efficient way
EDITED
I'm working with selenium and I have created same variable and method name in both class but the locators for both are different. Is is possible to do the same using super class concept ?
OrderDetailsSite1.java
OrderDetailsSite1.java
@FindBy(locator = "magento.ordered.item.name")
private QAFWebElement productName;
@FindBy(locator = "magento.ordered.item.quantity")
private QAFWebElement productQuantity;
@FindBy(locator = "magento.ordered.item.price")
private QAFWebElement productUnitPrice;
@FindBy(locator = "magento.ordered.item.subtotal")
private QAFWebElement productSubtotal;
OrderDetailsSite2.java
OrderDetailsSite2.java
@FindBy(locator = "order.detail.product.name")
private QAFWebElement productName;
@FindBy(locator = "order.detail.product.uprice")
private QAFWebElement productUnitPrice;
@FindBy(locator = "order.detail.product.quantity")
private QAFWebElement productQuantity;
@FindBy(locator = "order.detail.product.subtotal")
private QAFWebElement productSubtotal;
method name in both classes are same.
OrderDetailsSite1
OrderDetailsSite2
You could extract your code to a method in a static service/util class if the duplicated code bothers you that much. Other than that I only see the superclass solution as @AndyTurner mentioned.
– T A
Sep 4 '18 at 6:39
@AndyTurner, i have edited the question. please suggest
– NarendraR
Sep 4 '18 at 6:47
2 Answers
2
Make Components interface and implement it component classes
interface Components
...// declare all methods of your components like getProductList() etc
...
public void validateProductDetails(Components comp)
OrderDetailBean bean = (OrderDetailBean) ConfigurationManager.getBundle().getObject("order_details");
for (int i = 0; i < bean.getProductName().size(); i++)
assertResult( comp.getProductList().get(i).getProductName().getText(), bean.getProductName().get(i));
assertResult( comp.getProductList().get(i).getProductQuantity().getText(), bean.getProductQuantity().get(i));
assertResult( comp.getProductList().get(i).getProductUnitPrice().getText(), bean.getProductUnitprice().get(i));
assertResult(comp.getProductList().get(i).getProductSubtotal().getText(), bean.getProductSubtotal().get(i));
You can't check
instanceof T
. Wouldn't even compile.– Andy Turner
Sep 4 '18 at 6:28
instanceof T
Now
comp
is always null, so you'd get a NPE whenever bean.getProductName().size() > 0
.– Andy Turner
Sep 4 '18 at 6:30
comp
bean.getProductName().size() > 0
You can't invoke
getProductList()
on a T
, because it's an unbounded type variable.– Andy Turner
Sep 4 '18 at 6:32
getProductList()
T
@AndyTurner Thanks for suggestions, Now i think, I fixed all errors
– Tarun
Sep 4 '18 at 6:40
There is no need to use generics if you just use
T comp
. Components comp
works identically.– Andy Turner
Sep 4 '18 at 6:41
T comp
Components comp
EDIT, from updated question
From your code above, I would use this approach.
Create an interface that will provide common api for your order detail sites.
public interface class OrderDetailsComponent
private QAFWebElement productQuantity;
private QAFWebElement productQuantity;
private QAFWebElement productUnitPrice;
private QAFWebElement productSubtotal;
Both your classes should implement your interface
public class OrderDetailsSite1 implements OrderDetailsComponent
@FindBy(locator = "magento.ordered.item.name")
private QAFWebElement productName;
@FindBy(locator = "magento.ordered.item.quantity")
private QAFWebElement productQuantity;
@FindBy(locator = "magento.ordered.item.price")
private QAFWebElement productUnitPrice;
@FindBy(locator = "magento.ordered.item.subtotal")
private QAFWebElement productSubtotal;
public class OrderDetailsSite2 implements OrderDetailsComponent
@FindBy(locator = "order.detail.product.name")
private QAFWebElement productName;
@FindBy(locator = "order.detail.product.uprice")
private QAFWebElement productUnitPrice;
@FindBy(locator = "order.detail.product.quantity")
private QAFWebElement productQuantity;
@FindBy(locator = "order.detail.product.subtotal")
private QAFWebElement productSubtotal;
Thanks for contributing an answer to Stack Overflow!
But avoid …
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
But avoid …
To learn more, see our tips on writing great answers.
Required, but never shown
Required, but never shown
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Unless
OrderDetailsSite1
andOrderDetailsSite2
have a common superclass offering access to those properties, there is little you can do but duplicate code.– Andy Turner
Sep 4 '18 at 6:33