Как получить входной аргумент из фиктивного метода с помощью PowerMock / EasyMock - PullRequest
3 голосов
/ 02 марта 2012

У меня есть сущность Person класса.Класс ProcessPerson, содержащий метод process (), должен быть протестирован.

Мне нужно, чтобы объект был создан в методе process () и вызывался с помощью фиктивного метода create () фиктивного объекта personDao.

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

      public String getFirstName() {
        return firstName;
    }

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

public class ProcessPerson {
    @Autowired
    private PersonDao personDao;

    public void process() {
        Person person1 = new Person();
        person1.setFirstName("FN");
        //Do more logic to fill values into person object


        personDao.create(person1);
    }
}

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() {
        ProcessPerson process = new ProcessPerson();

        //Create dependent DAO mock object
        PersonDao personDaoMock = createMock(PersonDao.class);

        //Inject mock object
        ReflectionTestUtils.setField(process, "personDao", personDaoMock);

        replayAll();

        process.process();

        //QUESTION here: can I get the object person1 which was created in process() method 
        //and called via create() function of my mock object
        //
        //I need the object to do verification like this
        //Assert.assertEqual(person1.getFirstName(), "FN");

        verifyAll();
    }
}

Любое предложение, идея приветствуется

Спасибо

1 Ответ

1 голос
/ 04 марта 2012

EasyMock имеет «andDelegateTo», который можно использовать для того, что вы хотели бы сделать.Это позволяет вам получить некоторый локальный код, вызываемый при вызове макета.Я использую AtomicReference для получения объекта person от анонимного внутреннего класса.

@Test
public void TestCase1() {
    ProcessPerson process = new ProcessPerson();

    //Create dependent DAO mock object
    PersonDao personDaoMock = createMock(PersonDao.class);

    //Inject mock object
    ReflectionTestUtils.setField(process, "personDao", personDaoMock);

    final AtomicReference<Person> ref = new AtomicReference<Person>();

    personDaoMock.create(anyPerson());
    //expectLastCall().andDelegateTo(null);
    expectLastCall().andDelegateTo(new PersonDao() {
            @Override
            public void create(Person person1) {
                ref.set(person1);
            }
    });

    replayAll();

    process.process();

    assertNotNull(ref.get());

    verifyAll();
}

public static Person anyPerson()
{
    reportMatcher(Any.ANY);
    return null;
}

См. Документацию EasyMock для получения дополнительной информации об andDelegateTo ().

...