Tuesday, 24 April 2018

javax.servlet.ServletException: Circular view path

Problem :

javax.servlet.ServletException: Circular view path [error]: would dispatch back to the current handler URL [/latestOrder] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)



Solution :

You've annotated the controller method as producing JSON or String or any other object . You probably want to annotate the method with @ResponseBody and change its return type to allow you to return an object representation of the JSON that you want to include in the response


Preview:
  @RequestMapping(value="latestOrders",method = RequestMethod.GET)
    public @ResponseBody List<Order> listProducts(Model model) throws JMSException{
        List<Order> list=new ArrayList();
     list.add(staff1)
        return list;
    }

Friday, 20 April 2018

Run main thread before child thread.

As we all know in multi threading we cant guarantee the order of execution of threads .So in this example i will show you how to make sure one method calls after another.

To implement this we are going to use JOIN() concept of multi threading.


Join() : The join method allows one thread to wait for the completion of another. 

 MyThread1 t1 = new MyThread1();

if t1 is a Thread object whose thread is currently executing.
t1.join(); causes the current thread to pause execution until t1 thread terminates.



So to execute main thread before child thread it should call join method on main thread and hence child thread has to wait until competing of main thread.


Ruuner class: 

package com.thread;

public class ThreadRun {

 //Main Thread
 public static void main(String args[]) {
  //Main thread reference
  MyThread1.mainThread= Thread.currentThread();
  //Thread T-1
  MyThread1 t1 = new MyThread1();
  t1.setName("t1");
  t1.start();
  
  //Main thread logic
  for (int i = 0; i < 5; i++) {
   System.out.println("Main Thread");
  }
 }

}


Child Thread class:

package com.thread;

public class MyThread1 extends Thread {
 
 //static thread to access in other class
 static Thread mainThread;
 
 public void run() {
  
  try {
  // Child thread wait here until main completed
   mainThread.join();
  } catch (InterruptedException e1) {
   e1.printStackTrace();
  }
  
  //Thread -1  logic
  for (int i = 0; i < 5; i++) {
   System.out.println("child Thread -1 " + Thread.currentThread().getName());
   try {
    Thread.sleep(1000);
   } catch (Exception e) {
    System.out.println(e);
   }
  }
 }
}



Output:
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
child Thread -1 t1
child Thread -1 t1
child Thread -1 t1
child Thread -1 t1
child Thread -1 t1

Join on multiple threads in java


Join() : If a thread (name it T1) calls the join method on another Thread named T2, then T1 waits for T2 to complete its execution before it continues from that point.

below is the example of thread join .

Thread 1:
package com.thread;

public class MyThread1 extends Thread {

 public void run() {

  //Thread T-2 
  MyThread2 t2 = new MyThread2();
  t2.setName("t2");
  //T2 started
  t2.start();

  try {
   //Thread T-1 wait till Thread T-2 get completed
   t2.join();
   
  } catch (InterruptedException e1) {
   e1.printStackTrace();
  }

  //Thread -1  logic
  for (int i = 0; i < 5; i++) {
   System.out.println("child Thread -1 " + Thread.currentThread().getName());
   try {
    Thread.sleep(1000);
   } catch (Exception e) {
    System.out.println(e);
   }
  }
 }
}



Thread 2:

package com.thread;

public class MyThread2 extends Thread {

 public void run() {
  
  //Thread -2 logic
  for (int i = 0; i < 5; i++) {
   System.out.println("child Thread -2 " + Thread.currentThread().getName());
   try {
    Thread.sleep(1000);
   } catch (Exception e) {
    System.out.println(e);
   }
  }
 }
}



Thread runner class:
package com.thread;

public class ThreadRun {

 //Main Thread
 public static void main(String args[]) {
  
  //Thread T-1
  MyThread1 t1 = new MyThread1();
  t1.setName("t1");
  
  try {
   //start thread T-1
   t1.start();
   //Main thread wait for T1 to complete
   t1.join();
   
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  
  //Main thread logic
  for (int i = 0; i < 5; i++) {
   System.out.println("Main Thread");
  }
 }

}



Output:
child Thread -2 t2
child Thread -2 t2
child Thread -2 t2
child Thread -2 t2
child Thread -2 t2
child Thread -1 t1
child Thread -1 t1
child Thread -1 t1
child Thread -1 t1
child Thread -1 t1
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread

Wednesday, 18 April 2018

First Cucumber+java+maven project.



Prerequisite: following should be installed:
  • Java
  • Eclipse
  • Maven
  • maven-eclipse-plugin
  • Cucumber-eclipse-plugin


Step 1) Lets create a new project in eclipse by following steps:

Click on new –> Other –> Maven –> Maven Project — > Next

Step 2) Now click on Simple project and keep the default workspace location.

Step 3) Provide details as Artifact id, Group id, name and description. and click on Finish.

Step 4) This should create a basic maven project. 

Create packages as shown in the below snapshot and create new files in the project.






























Feature file:


Feature:  Adding numbers with a Calculator
  In order to not learn math
  As someone who is bad at math
  I want to be able to add numbers using a Calculator
  
  Scenario:  Add two positive numbers
    Given I have a Calculator
    When I add 1 and 1
    Then the sum should be 2
    
  Scenario:  Add a positive and negative number
    Given I have a Calculator
    When I add 1 and -1
    Then the sum should be 0
    
  Scenario:  Add two negative numbers
    Given I have a Calculator
    When I add -1 and -1
    Then the sum should be -2




Runner.java:

@CucumberOptions
(
features = "src/test/resources/featurefile/caclculator.feature",
glue = {"com.steps"},
plugin = {"pretty", "com.cucumber.listener.ExtentCucumberFormatter:target/cucumber-reports/report.html"},
tags={"~@ignore"} 
)

This class responsible for reading the features file 
Feature -- link of feature file
Glue Tag -- This holds the package containing steps
Plugin -- any report plugin you want to add.
Tags -- if you want to test specific tags methods like @functional @regression


package com.feature;

import org.junit.AfterClass;
import org.junit.runner.RunWith;

import com.cucumber.listener.Reporter;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
@RunWith(value = Cucumber.class)
@CucumberOptions
(features = "src/test/resources/featurefile/caclculator.feature",
glue = {"com.steps"},
plugin = {"pretty", "com.cucumber.listener.ExtentCucumberFormatter:target/cucumber-reports/report.html"},
tags={"~@ignore"} 
)
public class Runnner {

    @AfterClass
    public static void writeExtentReport() {
        Reporter.setSystemInfo("Machine", "Windows 7:-" + "64 Bit");
        Reporter.setSystemInfo("Maven", "3.5.2");
        Reporter.setSystemInfo("Java Version", "1.8.0_151");
    }
}



CalculatorSteps.java :



package com.steps;

import static org.junit.Assert.assertEquals;

import com.feature.Calculator;

import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;


public class CalculatorSteps {

 private Calculator calculator;

 private int actualSum;
        //  ^ - denotes start of string in feature file given statement
 //  $ - denotes end of string in feature file given statement

 @Given("^I have a Calculator$")
 public void intializeCalculator() {
  this.calculator = new Calculator();
 }
        //  ^ - denotes start of string in feature file when statement
 //  $ - denotes end of string in feature file when statement
        //  (-?\\d)  denotes the parameter in number format

 @When("^I add (-?\\d) and (-?\\d)$")
 public void whenIAddTwoNumbers(int firstNumber, int secondNumber) {
  this.actualSum = this.calculator.add(firstNumber, secondNumber);
 }

 @Then("^the sum should be (-?\\d)$")
 public void thenTheSumShouldBe(int expectedSum) {
  assertEquals("The expected sum does not equal the actual sum", expectedSum, this.actualSum);
 }
}




Calcuator.java:

This class is our main class which we need to test using our feature file.This contains our logical code generally.


package com.feature;

public class Calculator {

 public int add(int firstNumber, int secondNumber) {
  return firstNumber + secondNumber;
 }
}



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.practise</groupId>
 <artifactId>cucumber</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <description> </description>
 <properties>
  <cucumber.version>0.3.2</cucumber.version>
  <file.encoding>UTF-8</file.encoding>
  <java.version>1.8</java.version>
 </properties>
 <build>
  <plugins>
   <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
     <source>${jdk.version}</source>
     <target>${jdk.version}</target>
     <encoding>${file.encoding}</encoding>
    </configuration>
   </plugin>
  </plugins>
 </build>
 <dependencies>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>2.5.6</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
  </dependency>
  
  
  <!-- Cucummber dependencies -->
  
  <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>1.2.5</version>
        </dependency>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>1.2.5</version>
        </dependency>
        
         <!-- https://mvnrepository.com/artifact/com.vimalselvam/cucumber-extentsreport -->
        <dependency>
            <groupId>com.vimalselvam</groupId>
            <artifactId>cucumber-extentsreport</artifactId>
            <version>3.0.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.aventstack/extentreports -->
        <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>extentreports</artifactId>
            <version>3.1.2</version>
        </dependency>
  
 </dependencies>

</project>



As  you addded all these class and files now time to run the application

open class Runner and rightclick ->run as -->Junit test

You will see this on screen with all passing test cases.



Flow diagram of cucumber test.







java.lang.NoSuchMethodError: org.junit.runner.Description.createSuiteDescription(Ljava/lang/String;Ljava/io/Serializable;[Ljava/lang/annotation/Annotation;)Lorg/junit/runner/Description

Problem :

java.lang.NoSuchMethodError: org.junit.runner.Description.createSuiteDescription(Ljava/lang/String;Ljava/io/Serializable;[Ljava/lang/annotation/Annotation;)Lorg/junit/runner/Description;
at cucumber.runtime.junit.FeatureRunner.getDescription(FeatureRunner.java:43)
at cucumber.api.junit.Cucumber.describeChild(Cucumber.java:90)
at cucumber.api.junit.Cucumber.describeChild(Cucumber.java:38)
at org.junit.runners.ParentRunner.getDescription(ParentRunner.java:226)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:85)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)


Solution :

change you Junit version to latest i.e 4.12

Dependecy:
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
  </dependency>



Tuesday, 17 April 2018

Install cucumber plugin in eclipse

If you are trying to install Cucumber Eclipse Plugin from eclipse market place then it might not work for you as it is not the main cucumber plugin for running the test as BDD. Even this is not a mandatory plugin but it is quite handy ,and your feauture file look like plain text.


Install Cucumber Eclipse Plugin
It is easy to install Cucumber Eclipse Plugin, as it comes as a plugin for Eclipse IDE. 



Steps to follow:

1) Launch the Eclipse IDE and from Help menu, click “Install New Software”.

2) You will see a dialog window, click “Add” button.

3) Type name as you wish, let’s assume “Cucumber plugin” and location “http://cucumber.github.com/cucumber-eclipse/update-site”. Click OK.

4) You come back to the previous window but this time you must see Cucumber Eclipse Plugin option in the available software list. Just Check the box and press “Next” button.

5) select and check Cucumber Eclipse Plugin from the list and click Next.

6) Click “I accept the terms of the license agreement” then click Finish.

7) Let it install, it will take few seconds to complete.


few more next and ok and installation part is done for cucumber plugin.


Monday, 9 April 2018

You have not concluded your merge (MERGE_HEAD exists).


The problem is your previous pull failed to merge automatically and went to conflict state.
And the conflict wasn't resolved properly before the next pull.

1) Undo the merge and pull again.

To undo a merge:

git merge --abort [Since git version 1.7.4]

git reset --merge [prior git versions]

2) pull again

3) Merge again

2) Resolve the conflict properly

3) Don't forget to add and commit the merge.

4) git pull now everything should work fine.


This should fix your problem.

Spring boot with CORS

CORS (Cross-Origin Resource Sharing) errors occur when a web application running in a browser requests a resource from a different domain or...