Как издеваться над EntityManager? - PullRequest
27 голосов
/ 28 ноября 2010

Мне нужно смоделировать сущность-менеджер, чтобы сделать уровень службы тестирования (в моем случае фасадом сеанса) независимым от нижележащего уровня (который в моем случае является сущностью-менеджером).

Итак, как мне это сделать? Должен ли я использовать dbunit? Нужно ли мне легко / J (Mock)?

Ответы [ 3 ]

11 голосов
/ 14 января 2014

Я предлагаю использовать Mockito Framework, его очень легко использовать и понять.

@Mock
private EntityManager entityManager; 

Если вы хотите использовать любой метод, который принадлежит entityManager, вам следует вызвать.

Mockito.when(METHOD_EXPECTED_TO_BE_CALLED).thenReturn(AnyObjectoftheReturnType);

При запуске теста любой вызов, ранее объявленный в Mockito.when для EntityManager, вернет значение, указанное в объявлении.

Ознакомьтесь с полной документацией здесь.

https://static.javadoc.io/org.mockito/mockito-core/2.12.0/org/mockito/Mockito.html#stubbing

1 голос
/ 28 ноября 2010

Для издевательства я бы предложил powermock . Благодаря автоматически генерируемым прокси-серверам он может делать практически все, что вы можете себе представить, начиная с создания имитаций из интерфейсов, заканчивая перехватом инициализации и заканчивая подавлением статической инициализации (единственное, что меня поразило, это шутка с макетом java.lang.Object).

Допустим, SessionFacadeTest - это ваш набор тестов JUnit для SeesionFacade.

import static org.powermock.api.easymock.PowerMock.createMock;
import static org.powermock.api.easymock.PowerMock.replayAll;
import static org.powermock.api.easymock.PowerMock.verifyAll;
import static org.easymock.EasyMock.anyObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import javax.persistence.EntityManager;

@RunWith(PowerMockRunner.class)
@PrepareForTest({SessionFacade.class})
public class SessionFacadeTest {
    @Test public void persistingObject() {
        //set up stage
        SessionFacade fixture = new SessionFacade();
        EntityManager managerMock = createMock(EntityManager.class);
        fixture.setManager(managerMock);
        //record expected behavior
        managerMock.persist(anyObject());
        //testing stage
        replayAll();
        fixture.anyMethodThatCallPersist();
        //asserting stage
        verifyAll();
    }
}

(Примечание: я написал здесь, так что может даже не скомпилировать, но даст вам идею).

0 голосов
/ 03 апреля 2012

Я обычно использую EasyMock для проверки реализации конкретной службы в тестовых примерах.Ознакомьтесь с их руководством пользователя .Он включает в себя очень простое пошаговое руководство, которое объясняет основные концепции, лежащие в основе фреймворков в целом, и позволяет быстро приступить к использованию EasyMock.

...