Showing posts with label Testing. Show all posts
Showing posts with label Testing. Show all posts

How to test private method using PowerMock

PowerMock provides org.powermock.reflect.Whitebox class to test private methods, here one example to test private methods using PowerMock.

Main Class

package com.pretech;
public class EmployeeDetails {
	
	private int calculateSalary(int basic, int hra, int da) {
		return basic + hra + da;
	}
}

Test Class

package com.pretech;
import org.junit.Assert;
import org.junit.Test;
import org.powermock.reflect.Whitebox;
public class EmployeeDetailsTest {
	@Test
	public void testCalculateSalary() throws Exception {
		EmployeeDetails empDetails = new EmployeeDetails();
		int sum = Whitebox.<Integer> invokeMethod(empDetails,
				"calculateSalary", 1000, 500, 250);
		Assert.assertEquals(1750, sum);
	}
}

Output



image


How to Mock new instances using PowerMockito

In the previous example (Mocking Static methods) we created mock values for Static methods, in this example we will see how to mock new instances which are inside methods and there is no public method to set values.

Let us consider below EmployeeDetails class, in this example connection new instance is creating inside createConnection method, during testing we do not want to create a real Connection object for testing. PowerMockito provides PowerMockito.whenNew(..) method to set mock objects when new objects are creating inside the main class.

EmployeeDetails.java

package com.pretech;
public class EmployeeDetails {
	public boolean createConnection() {
		Connection con = new Connection();
		con.connectToDb();
		System.out.println("Connected to Employee Table");
		return true;
	}
}

Connection.java

package com.pretech;
public class Connection {
	public void connectToDb() {
		System.out.println("Creating Database connection");
	}
}

EmployeeDetailsTest.java

package com.pretech;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.legacy.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({EmployeeDetails.class})
public class EmployeeDetailsTest {
	
	@Mock
         Connection connection;
	@Test
	public void testcreateConnection() throws Exception {
	PowerMockito.whenNew(Connection.class).withNoArguments().thenReturn(connection);
         EmployeeDetails empDetails=new EmployeeDetails();
         Assert.assertTrue(empDetails.createConnection());
	}
}


Notes :PowerMock requires below annotations inside test classes

@RunWith(PowerMockRunner.class)
@PrepareForTest({EmployeeDetails.class})

Output



image

How to Mock Static Methods using PowerMockito

PowerMockito extends Mockito functionality with several new features such as mocking static and private methods. In this example we will see how to mock static methods using PowerMockito. PowerMockito provides PowerMockito.mockStatic(..) method to create Mock object for Static methods and Mockito.when(….) we can set the method call and expected values.

Let us consider below scenario using a static method which requires mocking to test getEmployee method.

EmployeeDetails.java

public class EmployeeDetails {
	public Employee getEmployee(String empName) {
		return EmployeeProvider.getEmployee(empName);
	}
	
}

EmployeeProvider.java

package com.pretech;
public class EmployeeProvider {
	public static Employee getEmployee(String empName) {
		Employee emp = new Employee();
		return emp;
	}
}

Employee.java

public class Employee {
	private String empName;
	private String empAddress;
	//Getters and setters
}

EmployeeDetailsTest.java

import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.legacy.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({EmployeeProvider.class})
public class EmployeeDetailsTest {
	@Mock
	Employee emp;
	@Test
	public void testgetEmployee() throws Exception {
	Mockito.when(emp.getEmpName()).thenReturn("Vinod");
	Mockito.when(emp.getEmpAddress()).thenReturn("Bangalore");
        PowerMockito.mockStatic(EmployeeProvider.class);
        Mockito.when(EmployeeProvider.getEmployee("Vinod")).thenReturn(emp);
        EmployeeDetails empDetails=new EmployeeDetails();
        Assert.assertEquals("Bangalore",empDetails.getEmployee("Vinod").getEmpAddress());
	}
	
}


Notes
PowerMock requires below annotations inside test classes

@RunWith(PowerMockRunner.class)
@PrepareForTest({EmployeeProvider.class})


Output



image


Dependencies used in this example.

<properties>
    <powermock.version>1.5.1</powermock.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4-legacy</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>1.5.1</version>
    </dependency>
</dependencies>

Mockito Simple Mocking Example

In the previous example EasyMock we created Mock object using EasyMock, in this example we will see how to create mock objects in Mockito.

1. Create a Maven project and add below dependency

  <dependency>
	<groupId>org.mockito</groupId>
	<artifactId>mockito-all</artifactId>
	<version>1.8.4</version>
</dependency>

2. Create a POJO class (Employee.java)

package com.pretech;
public class Employee {
	private String name;
	private String address;
	private String age;
//Getters and Setters

3. Create a Java class which needs to be tested

package com.pretech;
public class EmployeeDetails {
	public String createNewEmployee(Employee emp) {
		String result = null;
		if (emp.getAddress().equals("Bangalore")) {
			result = "Employee from bangalore";
		}
		return result;
	}
}

4. Create a Test class using Mockito

package com.pretech;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
public class EmployeeDetailsTest {
	@Mock
	Employee emp;
	@Before
	public void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);
	}
	@Test
	public void test1() {
		String expected = "Employee from bangalore";
		System.out.println("Test1");
		Mockito.when(emp.getAddress()).thenReturn("Bangalore");
		EmployeeDetails stdetails = new EmployeeDetails();
		assertEquals(expected, stdetails.createNewEmployee(emp));
	}
}

5. Run it as JUnit Test cases



image


EasyMock Simple Example

In this example we will see how to write java test cases using EasyMock. This api provides an easy way to create Mock Objects for interfaces and classes generating them on the fly. See more about EasyMock

Software Used

Java 1.7

EasyMock 3.2

Maven

Eclipse Juno

Create a Maven Project and below dependencies

      <dependency>
	<groupId>org.easymock</groupId>
	<artifactId>easymock</artifactId>
	<version>3.2</version>

Create a Simple Java POJO class (Employee.java)

package com.pretech;
public class Employee {
	private String name;
	private String address;
	private String age;
//Generate getters and setters

Create a class to use Employee object

package com.pretech;
public class EmployeeDetails {
	public Employee createNewEmp(Employee emp) {
		System.out.println("Inside create method" + emp.getName());
		return emp;
	}
		
}

Now we are going to test createNewStudent method using EasyMock

package com.pretech;
import static org.junit.Assert.assertEquals;
import org.easymock.EasyMock;
import org.junit.Test;
public class EmployeeDetailsTest {
	
	@Test
	public void testEmployee(){
		//Creating Employee mock object
		Employee employeeMock = EasyMock.createMock(Employee.class);
		//Setting up mock values in this example we are using getName 2 times so it is added .times(2) otherwise second time getName wont work
		EasyMock.expect(employeeMock.getName()).andReturn("Vinod").times(2);
	       //Activating mock
		EasyMock.replay(employeeMock);
	
		//Testing
		EmployeeDetails empetails=new EmployeeDetails();
		Employee emp=new Employee();
		emp=empetails.createNewEmp(employeeMock);
		System.out.println(emp);
		assertEquals("Vinod",emp.getName());
	}
}

Output

Run program as Junit and see below output

image


Confusion Matrix + Precision/Recall (Super Simple, With Examples)

  Confusion Matrix + Precision/Recall (Super Simple, With Examples) 1) Binary Classification Setup Binary classification means the model p...

Featured Posts