Как макетировать нестатические методы с помощью PowerMock - PullRequest
6 голосов
/ 13 января 2012

Я пытаюсь смоделировать внутренний вызов метода моего тестового метода.

Мой класс выглядит такспособ в PowerMock смоделировать строку

dao.getStudentDetails();

или заставить класс App использовать фиктивный объект dao во время выполнения junit вместо реального вызова dao, который подключается к БД?

Ответы [ 3 ]

8 голосов
/ 03 января 2013

Вы можете использовать метод whenNew() из PowerMock (см. https://github.com/powermock/powermock/wiki/Mockito#how-to-mock-construction-of-new-objects)

Полный тестовый набор

import org.junit.*;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest(App.class)
public class AppTest {
    @Test
    public void testGetStudent() throws Exception {
        App app = new App();
        MyDAO mockDao = Mockito.mock(MyDAO.class);
        Student mockStudent = Mockito.mock(Student.class);

        PowerMockito.whenNew(MyDAO.class).withNoArguments().thenReturn(mockDao);
        Mockito.when(mockDao.getStudentDetails()).thenReturn(mockStudent);
        Mockito.when(mockStudent.getName()).thenReturn("mock");

        assertEquals("mock", app.getStudent().getName());
    }
}

Я создал простой класс для ученика для этого теста:

public class Student {
    private String name;
    public Student() {
        name = "real";
    }
    public String getName() {
        return name;
    }
}
1 голос
/ 13 января 2012

Для того, чтобы извлечь большую часть из среды моделирования, объект MyDAO должен быть введен. Вы можете использовать что-то вроде Spring нашего Guice, или просто использовать фабричный шаблон, чтобы предоставить вам объект DAO. Затем в вашем модульном тесте у вас есть тестовая фабрика, которая поставляет вам фиктивные объекты DAO вместо реальных. Затем вы можете написать код, такой как:

Mockito.when(mockDao.getStudentDetails()).thenReturn(someValue);
0 голосов
/ 22 апреля 2013

Если у вас нет доступа к Mockito, вы также можете использовать PowerMock для этой же цели.Например, вы можете сделать следующее:

@RunWith(PowerMockRunner.class)
@PrepareForTest(App.class)
public class AppTest {
    @Test
    public void testGetStudent() throws Exception {
        MyDAO mockDao = createMock(MyDAO.class);
        expect(mockDao.getStudentDetails()).andReturn(new Student());        
        replay(mockDao);        

        PowerMock.expectNew(MyDAO.class).andReturn(mockDao);
        PowerMock.replay(MyDAO.class);         
        // make sure to replay the class you expect to get called

        App app = new App();

        // do whatever tests you need here
    }
}
...