TestNG #Test method running at feature level, how to run at scenario level - selenium

I want to execute #AfterMethod at scenario level(Just after each Scenario) of the feature file. But #AfterMethod executing at feature level(after all scenarios) of the feature file.
how can I achieve this.
Below is the my code snippet.
Runner Class.
#SuppressWarnings("unused")
#CucumberOptions(features = "Features", glue = { "com.dell.clouddam.stepdefinitions" },
dryRun = false,
plugin = {
"com.cucumber.listener.ExtentCucumberFormatter:target/cucumber-reports/report.html", "pretty",
"json:target/cucumber-reports/Cucumber.json" }, monochrome = true)
public class MyTestRunner {
private TestNGCucumberRunner testNGCucumberRunner;
private DriverFactory driverFactory;
private WebDriver driver; //these are made private because these are specific to this class only.
private ConfigReader configReader;
Properties properties;
#BeforeSuite(alwaysRun = true)
public void getProperty() {
configReader = new ConfigReader();
properties = configReader.initProp();
System.out.println("#BeforeClass getpropeety ");
}
#BeforeClass(alwaysRun = true)
public void setUpClass() throws Exception {
testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
}
#BeforeMethod(alwaysRun = true)
public void launchBrowser() throws FileNotFoundException, IOException, Exception {
String browserName = properties.getProperty("environment");
driver = driverFactory.initDriver(browserName);
driver.get(properties.getProperty("author_url"));
((RemoteWebDriver) driver).getSessionId();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
#DataProvider
public Object[][] features() {
return testNGCucumberRunner.provideFeatures();
}
#Test(groups = "cucumber", description = "Runs Cucumber Feature", dataProvider = "features")
public void feature(CucumberFeatureWrapper cucumberFeature) {
testNGCucumberRunner.runCucumber(cucumberFeature.getCucumberFeature());
}
#AfterMethod(description = "Executes After Each Iteration")
public void afterMethod(ITestResult res) throws Exception {
driver.quit();
}
#AfterTest(alwaysRun = true)
public void afterTest() throws Throwable {
}
#AfterClass(alwaysRun = true)
public void tearDownClass() throws Throwable {
testNGCucumberRunner.finish();
}
}
DriverFactory.java
public class DriverFactory {
public static WebDriver driver;
HashMap<String, Object> moonConfig = new HashMap<String, Object>();
private ConfigReader configReader=new ConfigReader();;
Properties properties = configReader.initProp();
public WebDriver initDriver(String environment) throws FileNotFoundException, IOException, Exception {
System.out.println("Browser value is - " + environment);
if (environment.equals("chrome")) {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
else if (environment.equals("firefox")) {
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
}
else if (environment.equals("safari")) {
driver = new SafariDriver();
}
else {
System.out.println("Please select the correct browser value");
}
getDriver().manage().deleteAllCookies();
getDriver().manage().window().maximize();
return getDriver();
}
public static synchronized WebDriver getDriver() {
return driver;
}
}
Pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>SampleDAM</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>4.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.paulhammant</groupId>
<artifactId>ngwebdriver</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>2.48.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.jesg/phantomjsdriver -->
<dependency>
<groupId>com.github.jesg</groupId>
<artifactId>phantomjsdriver</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.saucelabs</groupId>
<artifactId>sauce_bindings</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.53.0</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-jvm</artifactId>
<version>1.2.5</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-core</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-html</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-jvm-deps</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>gherkin</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-testng</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.26-incubating</version>
</dependency>
<dependency>
<groupId>com.vimalselvam</groupId>
<artifactId>cucumber-extentsreport</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<parallel>methods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
<suiteXmlFiles>
<suiteXmlFile>CloudDAM.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>

For cucumber, you would need to use Cucumber-jvm's annotations eg. (io.cucumber.java.After) #After, #Before - run before and after each scenario. There is no annotation which supports feature end. There is #AfterAll - which runs after all features all scenarios. If you want more granular control, you need to implement ConcurrentEventListener.

You can use tags on feature level and scenario level and you can set value and priority in each hook.
#Before(value="#smoke", order=1)
public void browserSetup() {
System.out.println("I am inside browserSetup");
}
And you can define the tags in the TestRunner
#CucumberOptions(features = "src/test/resources/featuresWithTags/Tags.feature",
glue = {"stepDefinitions"},
monochrome = true,
tags = "#Smoke or #Regression and #Important")

Related

Why Test method is not executing?

I am using selenium 3.141.59 to automate gmail application as an example in Edge in IE Mode.
If I use Selenium 4.0.0 or greater , PageFactory.initElements doesn't support .
I have to execute script for below environment :
Windows 11 (64 bit)
Edge 105.0.1343.50 ( Open in IE mode. Its requirement of an application)
DriverManager.java
package managers;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.UnexpectedAlertBehaviour;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
public class DriverManager {
public WebDriver driver;
DesiredCapabilities capabilities;
#SuppressWarnings("unchecked")
#Parameters({ "browserName" })
#BeforeClass(alwaysRun = true)
public void initialize(String browser) throws IOException, InterruptedException {
if (browser.equalsIgnoreCase("edge")) {
System.setProperty("webdriver.edge.driver",
"D:\\My_Workspace\\EdgeInIEModeTest\\drivers\\msedgedriver.exe");
capabilities = new DesiredCapabilities();
// Creating an object of EdgeDriver
driver = new EdgeDriver();
driver.manage().window().maximize();
// Deleting all the cookies
driver.manage().deleteAllCookies();
// Specifiying pageLoadTimeout and Implicit wait
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
} else if (browser.equalsIgnoreCase("edgeForWindows11")) {
// Selenium 4 + version
// System.out.println("edgeForWindows11 IN");
// System.setProperty("webdriver.ie.driver",
//
// "D:\My_Workspace\EdgeInIEModeTest\drivers\IEDriverServer32bit.exe\IEDriverServer32bit.exe");
//
// InternetExplorerOptions ieOptions = new InternetExplorerOptions();
// ieOptions.attachToEdgeChrome();
// ieOptions.withEdgeExecutablePath("C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe");
//
// driver = new InternetExplorerDriver(ieOptions);
// Selenium 3.141.59
System.setProperty("webdriver.ie.driver",
"D:\\My_Workspace\\EdgeInIEModeTest\\drivers\\IEDriverServer32bit.exe");
InternetExplorerOptions edgeIe11Options = new InternetExplorerOptions();
Map<String, Object> ops = (Map<String, Object>) edgeIe11Options.getCapability("se:ieOptions");
ops.put("ie.edgechromium", true);
ops.put("ie.edgepath", "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"); // Edge Browser
// directory
// path
edgeIe11Options.introduceFlakinessByIgnoringSecurityDomains();
edgeIe11Options.ignoreZoomSettings();
edgeIe11Options.enablePersistentHovering();
edgeIe11Options.takeFullPageScreenshot();
edgeIe11Options.disableNativeEvents();
edgeIe11Options.requireWindowFocus();
edgeIe11Options.destructivelyEnsureCleanSession();
edgeIe11Options.setCapability("ignoreProtectedModeSettings", true);
edgeIe11Options.setUnhandledPromptBehaviour(UnexpectedAlertBehaviour.IGNORE);
driver = new InternetExplorerDriver(edgeIe11Options);
}
}
public static String getIPAddress() {
InetAddress IP = null;
try {
IP = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return IP.getHostAddress();
}
public void launchGmailApplication() throws InterruptedException, IOException {
System.out.println("In launchApplication method for EdgeInIEMode Windows 11");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get("http://www.google.com");
Thread.sleep(3000);
try {
driver.switchTo().alert().accept();
} catch (Exception a) {
}
}
#AfterClass(alwaysRun = true)
public void TeardownTest() {
System.out.println(driver.getCurrentUrl());
if (null != driver) {
driver.close();
driver.quit();
}
}
}
BasePage.Java
package pages;
import org.openqa.selenium.WebDriver;
public abstract class BasePage {
public WebDriver driver;
public BasePage(WebDriver driver) {
// TODO Auto-generated constructor stub
this.driver = driver;
}
}
LogInPage.Java
import java.io.IOException;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import managers.DriverManager;
import pages.LogInPage;
public class LogInTest extends DriverManager {
public LogInPage loginPage;
#BeforeClass(alwaysRun = true)
public void launchApplication() throws InterruptedException, IOException {
loginPage = PageFactory.initElements(driver, LogInPage.class);
launchGmailApplication();
}
#Test
public void invokeDriver() {
System.out.println("Hello");
loginPage.clickOnGmailMenuOption();
loginPage.clickOnSignInButton();
loginPage.logInToGmailApplication();
}
}
LogInTest.Java
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import managers.DriverManager;
import pages.LogInPage;
public class LogInTest extends DriverManager {
public LogInPage loginPage;
#BeforeMethod(alwaysRun = true)
public void launchApplication() {
loginPage = PageFactory.initElements(driver, LogInPage.class);
loginPage.logInToGmailApplication();
}
#Test
public void invokeDriver() {
System.out.println("Hello");
loginPage.clickOnGmailMenuOption();
loginPage.clickOnSignInButton();
loginPage.logInToGmailApplication();
}
}
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cemtrex.com</groupId>
<artifactId>EdgeInIEModeTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.3.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>if-suite-exists</id>
<activation>
<property>
<name>!env.SUITES</name>
</property>
</activation>
<properties>
<suites>GlobalSuite</suites>
</properties>
</profile>
<!-- browsers -->
<profile>
<id>firefox</id>
<properties>
<capabilities>/firefox.capabilities</capabilities>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>chrome</id>
<properties>
<capabilities>/chrome.capabilities</capabilities>
</properties>
</profile>
<profile>
<id>ie</id>
<properties>
<capabilities>/ie.capabilities</capabilities>
</properties>
</profile>
</profiles>
<properties>
<suites>${env.SUITES}</suites>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<resources>
<resource>
<directory>src/main/java/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/java/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<!--<inherited>true</inherited> -->
<configuration>
<!--<testFailureIgnore>false</testFailureIgnore> -->
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/suites/${suites}.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
After Execute :

Parallel execution is failing. its executing test successfully on one session and the other session, no actions being performed

I am trying to execute tests in parallel using testng and selenium. when I triggered the tests, its executing successfully on one session, and the other session it just hangs.. am seeing following error in logs.
I tried using methods/classes/tests as parallel options in testng.xml. its same issue in all cases.
Exception in thread "pool-1-thread-1" org.openqa.selenium.WebDriverException: java.net.SocketException: Software caused connection abort: recv failed
Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:24:21.231Z'
System info: host: 'PF12FNSG20HE', ip: '146.27.24.164', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_171'
Driver info: driver.version: RemoteWebDriver
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:92)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:548)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:605)
at org.openqa.selenium.remote.RemoteWebDriver.getScreenshotAs(RemoteWebDriver.java:294)
at AEMSites.Base.getScreenShot(Base.java:186)
at resources.TestListeners.onTestFailure(TestListeners.java:36)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1895)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1879)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1292)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
My code is as follows:
POM File:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>AEMSites</groupId>
<artifactId>ChevronECOM</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>ChevronECOM</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Selenium -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.13.0</version>
</dependency>
<!-- TestNG -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8</version>
<scope>compile</scope>
</dependency>
<!-- Extent Reports -->
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<version>2.21.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<useSystemClassLoader>true</useSystemClassLoader>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
<properties>
<property>
<name>parallel</name>
<value>methods</value>
</property>
<property>
<name>threadCount</name>
<value>2</value>
</property>
<property>
<name>dataproviderthreadcount</name>
<value>2</value>
</property>
</properties>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>2.15</version>
</plugin>
</plugins>
</build>
</project>
Test Ng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name=" test suite" parallel="methods" thread-count="2">
<listeners>
<listener class-name="resources.TestListeners"/>
<listener class-name="ExtentReportsChevron"/>
<listener class-name="resources.RetryListenerClass"/>
</listeners>
<test name="Chrome Tests" parallel="methods" thread-count="2">
<classes>
<class name="AEMSites.TechronCleanHomePageTests"/>
<class name="AEMSites.TechronCleanContactUsPageTests"/>
<class name="AEMSites.TechronCleanFAQTests"/>
<class name="AEMSites.TechronCleanWhereToBuyPageTests"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
My Tests:
package AEMSites;
import java.lang.reflect.Method;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.openqa.selenium.WebDriver;
import AEMSites.pageObjects.TechronCleanHomePage;
import AEMSites.pageObjects.TechronCleanSearchResultsPage;
public class TechronCleanHomePageTests extends Base
{
TechronCleanHomePage tch;
TechronCleanSearchResultsPage tcsrp;
//public static String experience;
#BeforeMethod
public void HomePageNavigation(Method method) throws Throwable
{
//FileInputStream fis = new FileInputStream("C:\\Users\\hpak\\ChevronECOM\\Variables.properties");
//prop.load(fis);
//experience=prop.getProperty("experience");
System.out.println("Test Executing is: " + method.getName());
driver=initializeDriver();
System.out.println("step1" + driver);
System.out.println("step1" + url);
driver.get(url);
System.out.println("step2");
System.out.print("Expericene in test method is"+experience);
if(experience.equalsIgnoreCase("mobile"))
{
System.out.println("In Home page tests before method in mobile");
tch = new TechronCleanHomePage(driver);
tch.getMobileHamburgerMenu().click();
}
else
{
driver.manage().window().maximize();
}
}
#Test(groups = {"HomePage"})
public void TC_014_VerifyProductsLinkOnHomePage() throws InterruptedException
{
tch = new TechronCleanHomePage(driver);
System.out.println("In test case method, experience is "+experience);
if(experience.equalsIgnoreCase("mobile"))
{
tch.getProducts_mobile().click();
TimeUnit.SECONDS.sleep(10);
}
else
{
System.out.println("In desktop method");
tch.getProducts().click();
}
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("products.html"));
}
#Test(groups = {"HomePage"})
public void TC_043_VerifyWhyTechronLinkOnHomePage()
{
tch = new TechronCleanHomePage(driver);
tch.getWhyTechron().click();
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("why-techron.html"));
}
#Test(groups = {"HomePage"})
public void TC_002_VerifySearchAndVisitProductPage()
{
System.out.println("In search test");
tch = new TechronCleanHomePage(driver);
tcsrp = new TechronCleanSearchResultsPage(driver);
tch.getSearchIcon().click();
tch.getSearchBar().sendKeys("Motor Oil");
tch.getSearchBar().sendKeys(Keys.RETURN);
try
{
Assert.assertTrue(driver.getPageSource().contains("Motor Oil"));
Assert.assertTrue(driver.getPageSource().contains("Search Results"));
Assert.assertTrue(driver.getPageSource().contains("Techron Complete Fuel System Cleaner"));
}
catch (Error e)
{
System.out.println(e);
}
tcsrp.getProductLink().click();
try
{
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("techron-complete-fuel-system"));
Assert.assertTrue(driver.getPageSource().contains("Concentrate Plus Complete Fuel System Cleaner"));
}
catch (Error e)
{
System.out.println(e);
}
}
#Test(groups = {"HomePage"})
public void TC_012_VerifyProductLineupOnHomePage()
{
tch = new TechronCleanHomePage(driver);
String findproductext=tch.getFindProductText().getText();
System.out.print("one"+findproductext);
Assert.assertTrue(findproductext.contains("FIND A PRODUCT"));
String imagesrc=tch.getImageSource().getAttribute("src");
System.out.print("two"+imagesrc);
Assert.assertTrue(imagesrc.contains("/content/dam"));
tch.getImageSource().click();
String imagesrcafterclick=tch.getImageSource().getAttribute("src");
System.out.print("three"+imagesrcafterclick);
Assert.assertTrue(imagesrcafterclick.contains("/content/dam"));
Assert.assertTrue(tch.getLearnMoreBtnOnPrdLineUp().isDisplayed());
}
#Test(groups = {"HomePage"})
public void TC_041_VerifyWhereToBuyOnHomePage()
{
tch = new TechronCleanHomePage(driver);
tch.getWhereToBuy().click();
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("where-to-buy.html"));
}
#Test(groups = {"HomePage"})
public void TC_046_VerifyFAQLinkOnHomePage()
{
tch = new TechronCleanHomePage(driver);
tch.getFAQ().click();
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("faq.html"));
}
#Test(groups = {"Footer"})
public void TC_003_VerifyContactUsLinkOnFooter()
{
tch = new TechronCleanHomePage(driver);
tch.getContactUs().click();
System.out.println("Current Window url is"+tch.getCurrentWindowUrl());
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("contact-us.html"));
}
#Test(groups = {"HomePage"})
public void TC_010_VerifyMarketFormOnHomePage() throws InterruptedException
{
tch = new TechronCleanHomePage(driver);
tch.getMarketoFirstName().sendKeys("TestFirst");
tch.getMarketoLastName().sendKeys("TestLast");
tch.getMarketoEmail().sendKeys("ignore#gmail.com");
tch.getMarketoSubmitBtn().click();
TimeUnit.SECONDS.sleep(5);
System.out.println("Current Window url is"+tch.getCurrentWindowUrl());
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("aliId"));
}
#Test(groups = {"Footer"})
public void TC_004_VerifyTermsOfUseLinkOnFooter()
{
tch = new TechronCleanHomePage(driver);
tch.getTermsOfUse().click();
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("terms-of-use"));
Assert.assertTrue(driver.getPageSource().contains("terms of use"));
}
#Test(groups = {"Footer"})
public void TC_005_VerifyPrivacyPolicyOnFooter()
{
tch = new TechronCleanHomePage(driver);
tch.getPrivacyPolicy().click();
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("privacy"));
Assert.assertTrue(driver.getPageSource().contains("privacy statement"));
}
#Test (groups = {"Footer"})
public void TC_006_VerifyChevronLubricantsLinkOnFooter()
{
tch = new TechronCleanHomePage(driver);
tch.getChevronLubricants().click();
Assert.assertTrue((tch.getCurrentWindowUrl()).contains("https://www.chevronlubricants.com/"));
}
#Test (enabled=false)
public void VerifyTabItemsOnHomePage()
{
List<WebElement> allLinks = ((WebDriver) driver).findElements(By.tagName("a"));
System.out.println("In Verify Tab items test");
System.out.println(allLinks);
for (WebElement w : allLinks)
{
w.click();
if (((WebDriver) driver).findElement(By.xpath("Element on the page")).isDisplayed())
{
System.out.println("Link:"+w.getText()+"is working");
}
else
{
System.out.println("Link:"+w.getText()+"is not working");
}
((WebDriver) driver).navigate().back();//To come back to the Home screen
}
}
#AfterMethod
public void closeAll()
{
//System.out.println("Test:" + result.getMethod().getMethodName()+ " is "+status.toString().toUpperCase());
driver.quit();
//driver.close();
driver=null;
}
}
can someone please suggest.
Try to run with
#BeforeMethod(alwaysRun = true)
public void HomePageNavigation(Method method)
And
#AfterMethod(alwaysRun = true)
public void closeAll()

Not able to generate extentreport - though tests run successfully

Though my tests ran successfully, I am not able to generate extent-report, below codes and pom.xml I used
Any help is appreciated. Hope I am clear on my question. Please help to solve this issue:
import java.io.File; import java.util.Date;
import com.relevantcodes.extentreports.DisplayOrder;
import com.relevantcodes.extentreports.ExtentReports;
public class ExtentManager {
private static ExtentReports extent;
public static ExtentReports getInstance() {
if (extent == null) {
Date d=new Date();
String fileName=d.toString().replace(":", "_").replace(" ", "_")+".html";
extent = new ExtentReports("C:\\Users\\dilu316\\Documents"+fileName, true, DisplayOrder.NEWEST_FIRST);
extent.loadConfig(new File(System.getProperty("user.dir")+"//ReportsConfig.xml"));
// optional
extent.addSystemInfo("Selenium Version", "2.53.0").addSystemInfo(
"Environment", "QA");
}
return extent;
}
}
Tests:
public class DummyTestB extends BaseTest{
ExtentReports rep = ExtentManager.getInstance();
ExtentTest test;
#Test
public void testB()
{
test = rep.startTest("DummyTestB");
test.log(LogStatus.INFO, "Starting the test test B");
openBrowser("Mozilla");
test.log(LogStatus.INFO, "Open the Browser");
navigate("appurl");
type("email_id","hara.mohapatra#gmail.com");
click("button_xpath");
verifyTitle();
reportFailure("title does not match");
test.log(LogStatus.PASS, "Test B Passed");
}
#AfterMethod
public void quit()
{
rep.endTest(test);
rep.flush();
}
}
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.selenium.core.ddf</groupId>
<artifactId>DataDriven_Core_Framework</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>DataDriven Core Framework</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.53.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.relevantcodes/extentreports -->
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.2</version>
</dependency>
</dependencies>
</project>
Thanks in Advance.
public class BaseClass
{
public static WebDriver driver;
public static ExtentReports report;
public static ExtentTest test;
#BeforeSuite
public void InitIate() throws Exception
{
report = new ExtentReports("YOURPATH", true);
report.loadConfig("YOURPATH);
}
}
public class TestSet1 extends BaseClass
{
#Test (priority=1)
public static void TestCase1()
{
test = report.startTest("TC desc");
// Blah Blah --your steps
report.endTest(test);
report.flush();
}
}

Spring Data Rest Not Mapped

I am trying to use spring data rest. I have included its dependency in pom and defined following bean but no mapping is being created for repos. From where do I began to look for problem?
#Bean
public RepositoryRestConfigurer repositoryRestConfigurer(){
return new RepositoryRestConfigurerAdapter(){
#Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config){
config.setBasePath("/api");
}
};
}
following is pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<springframework.version>4.3.1.RELEASE</springframework.version>
<springsecurity.version>4.2.0.RELEASE</springsecurity.version>
<hibernate.core.version>4.3.11.Final</hibernate.core.version>
<hibernate.validator.version>5.1.3.Final</hibernate.validator.version>
<mysql.connector.version>5.1.31</mysql.connector.version>
<postgresql.version>9.4-1200-jdbc41</postgresql.version>
<joda-time.version>2.3</joda-time.version>
<jackson-version>2.7.5</jackson-version>
<maven-compiler-plugin-version>3.2</maven-compiler-plugin-version>
<maven-war-plugin-version>2.4</maven-war-plugin-version>
<source-jdk>1.8</source-jdk>
<target-jdk>1.8</target-jdk>
<war-source-directory>src/main/webapp</war-source-directory>
<war-name>dmapp</war-name>
<final-name>dmapp</final-name>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
<version>2.6.1.RELEASE</version>
</dependency>
<!-- SPRING SECURITY -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${springsecurity.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${springsecurity.version}</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.core.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.11.Final</version>
</dependency>
<!-- jsr303 validation -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.validator.version}</version>
</dependency>
<!-- Javax Transactions -->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<!-- POSTGRESQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<!-- Joda-Time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- To map JodaTime with database type -->
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.core</artifactId>
<version>3.0.0.CR1</version>
</dependency>
<!-- Servlet+JSP+JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency> -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin-version}</version>
<configuration>
<source>${source-jdk}</source>
<target>${target-jdk}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin-version}</version>
<configuration>
<warSourceDirectory>${war-source-directory}</warSourceDirectory>
<warName>${war-name}</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>${final-name}</finalName>
</build>
AppConfig.java
package com.pdma.dmapp.configuration;
#Configuration
#EnableWebMvc
#ComponentScan(basePackages = "com.pdma.dmapp")
public class AppConfig extends WebMvcConfigurerAdapter{
#Bean(name="multipartResolver")
public StandardServletMultipartResolver resolver(){
return new StandardServletMultipartResolver();
}
#Override
public void configureViewResolvers(ViewResolverRegistry registry){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
#Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/webResources/**").addResourceLocations("/webResources/");
registry.addResourceHandler("/app/**").addResourceLocations("/app/");
}
}
PersistenceContext.java
package com.pdma.dmapp.configuration;
#Configuration
#EnableTransactionManagement
#PropertySource(value = {"classpath:db.properties"})
#EnableJpaRepositories("com.pdma.dmapp.module")
public class PersistenceContext {
#Autowired
private Environment environment;
#Bean
#Autowired
public LocalSessionFactoryBean sessionFactory(){
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String [] {"com.pdma.dmapp.module"});
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
#Bean
#Autowired
LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource,
Environment env){
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean =
new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan(new String [] {"com.pdma.dmapp.module"});
entityManagerFactoryBean.setJpaProperties(hibernateProperties());
return entityManagerFactoryBean;
}
#Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName( environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl( environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername( environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword( environment.getRequiredProperty("jdbc.password"));
return dataSource;
}
private Properties hibernateProperties(){
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
return properties;
}
#Bean
#Autowired
public HibernateTransactionManager hibernateTXManager(SessionFactory sessionFactory){
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
#Bean
#Autowired
JpaTransactionManager jpaTXManager(EntityManagerFactory entityManagerFactory){
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
/* Same Bean Created as above because CrudRepository Methods are annotated with #Transactional
* So they require a bean named transactionManager*/
#Bean
#Autowired
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory){
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
#Bean
#Autowired
public RepositoryRestConfigurer repositoryRestConfigurer(){
return new RepositoryRestConfigurerAdapter(){
#Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config){
config.setBasePath("/api");
}
};
}
}
SecurityConfiguration.java
package com.pdma.dmapp.configuration;
#Configuration
#EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
#Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception
{
auth.inMemoryAuthentication()
.withUser("Admin")
.password("admin123")
.roles("Admin");
}
#Override
public void configure(HttpSecurity http) throws Exception
{
http.authorizeRequests()
.antMatchers("/login","/webResources/**").permitAll()
.antMatchers("/**").access("hasRole('Admin')")
.and().formLogin()
.loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.and().csrf()
.and().exceptionHandling().accessDeniedPage("/accessDenied");
http.sessionManagement()
.maximumSessions(1)
.expiredUrl("/login.html");
}
}
AppInitializer.java
package com.pdma.dmapp.configuration;
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
private static final String LOCATION = "D:/uploads/";
private static final long MAX_FILE_SIZE = 1024*1024*200;
private static final long MAX_REQUEST_SIZE = 1024*1024*200;
private static final int FILE_SIZE_THRESHOLD = 0;
#Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return new Class [] {AppConfig.class, PersistenceContext.class, SecurityConfiguration.class};
}
#Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}
#Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return new String [] {"/"};
}
#Override
protected void customizeRegistration(ServletRegistration.Dynamic registration){
registration.setMultipartConfig(getMultipartConfigElement());
}
private MultipartConfigElement getMultipartConfigElement(){
MultipartConfigElement element = new MultipartConfigElement(LOCATION,
MAX_FILE_SIZE,
MAX_REQUEST_SIZE,
FILE_SIZE_THRESHOLD);
return element;
}
#Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new SessionListener());
}
}
Repository
package com.pdma.dmapp.module.surveys.repo;
#Transactional("jpaTXManager")
#RepositoryRestResource(exported = true)
public interface SurveyorRepo extends CrudRepository<Surveyor, Integer> {
Surveyor findByDeviceImeiNo1OrDeviceImeiNo2(String deviceImeiNo1, String deviceImeiNo2);
List<Surveyor> findByDistrictDistrictId(Integer districtId);
}
First, try to configure Sprint Data REST in the following way:
#Configuration
public class CustomRepositoryRestConfiguration extends RepositoryRestMvcConfiguration {
#Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config){
config.setBasePath("/api");
}
...
}
Also, make sure your repository beans are available in Spring context and annotate them with #RepositoryRestResource annotation.
EDIT: I think the main problem is how you mix MVC with Spring Data REST. Use RepositoryRestMvcConfiguration instead of RepositoryRestConfigurerAdapter. You can find the detailed guide on how to setup both in official guides here and here.
UPDATE: With newer version of Spring Data REST the base path is set in different way:
#Configuration
public class RestDataConfig extends RepositoryRestMvcConfiguration {
#Override
#Bean
public BaseUri baseUri() {
config().setBasePath("/api");
return new BaseUri(config().getBaseUri());
}
}
Worth mentioning is the fact that in Spring Data REST 3.+ API of RepositoryRestMvcConfiguration changed and in case people seeking the answer for versions 3+ could:
#Import RepositoryRestMvcConfiguration
#Import( ...,
RepositoryRestMvcConfiguration.class,
...)
public class YourConfig { //snip }
Register a RepositoryRestConfigurer #Bean by extending RepositoryRestConfigurerAdapter and overriding basePath
#Bean
public RepositoryRestConfigurer repositoryRestConfigurer() {
return new RepositoryRestConfigurerAdapter() {
#Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config){
// snip
config.setBasePath("/data");
// snip
}
Worth noting is the fact that the same approach can be used to expose IDs for entities and managing other features RepositoryRestConfigurer is responsible for.

spring boot primefaces fileupload doesn't work

I'm trying setup an application with spring boot and primefaces but the fileupload function doesn't work. I've tried several configurations without success. Please can someone help me with this problem.
This is the config:
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.2-1003-jdbc4</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.8-02</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.8-02</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.1.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>8.0.15</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>8.0.15</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.0.15</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>1.1.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.primefaces.themes</groupId>
<artifactId>all-themes</artifactId>
<version>1.0.10</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories>
</project>
Spring Boot Application class.
#Configuration
#ComponentScan
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
#Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(new Class[] { Application.class, Initializer.class});
}
#Bean
public ServletRegistrationBean servletRegistrationBean() {
FacesServlet servlet = new FacesServlet();
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(servlet, "*.jsf");
return servletRegistrationBean;
}
#Bean
public ServletListenerRegistrationBean<ConfigureListener> jsfConfigureListener() {
return new ServletListenerRegistrationBean<ConfigureListener>(new ConfigureListener());
}
#Bean
public ServletListenerRegistrationBean<RequestContextListener> requestContextListener() {
return new ServletListenerRegistrationBean<RequestContextListener>(new RequestContextListener());
}
#Bean
public FilterRegistrationBean contextFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
FileUploadFilter fileUploadFilter = new FileUploadFilter();
registrationBean.setFilter(fileUploadFilter);
registrationBean.addServletRegistrationBeans(servletRegistrationBean());
registrationBean.setOrder(2);
return registrationBean;
}
#Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.setPort(8083);
return tomcat;
}
JSF Form
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{fileBean.handleFileUpload}" />
</h:form>
JSF Backing Bean
#ManagedBean
#RequestScoped
public class FileBean {
private UploadedFile file;
public UploadedFile getFile() {
return file;
}
public void setFile(UploadedFile file) {
this.file = file;
}
public void handleFileUpload(FileUploadEvent event) {
System.out.println("in handle file upload...");
UploadedFile file = event.getFile();
System.out.println(file.getFileName());
//application code
}