V Ng
V Ng

Reputation: 41

Powermock - how to mock a specific method and leave the rest of the object as-is

I have a Person class with get set for FirstName, LastName

A TestClass to execute TestCase1

Can we just only mock a specific method (getLastName) and leave every thing else (other internal fields, functions ... as-is)?

public class Person { 
    private String firstName;
    private String lastName;

      public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

import static org.powermock.api.easymock.PowerMock.*;
import static org.easymock.EasyMock.expect;

@RunWith(PowerMockRunner.class)
@PrepareForTest ( {Person.class} )
public class TestClass {

    @Test
    public void TestCase1() {
        Person person = createNiceMock(Person.class);
        person.setFirstName = "First name";

        expect(person.getLastName()).andReturn("Fixed value").anyTimes();

        replayAll();

        String ln = person.getLastName(); //will return "Fixed value";

        String fn = person.getFirstName(); 
        // Currently it returns null because of createNiceMock
        // but I want it to return "First name" (value has been set to mock object)
        // Is it possible?

        verifyAll();
    }
}

Upvotes: 1

Views: 1505

Answers (1)

Dylan Bijnagte
Dylan Bijnagte

Reputation: 1356

You can use spy to mock individual (including private) methods:

Person classUnderTest = PowerMockito.spy(new Person());

    // use PowerMockito to set up your expectation
    PowerMockito.doReturn("Fixed value").when(classUnderTest, "getLastName");

Upvotes: 3

Related Questions