2010-11-28 5 views
21

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

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

ответ

8

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

@Mock 
private EntityManager entityManager; 

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

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

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

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

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

1

Для насмешек я предлагаю powermock. Благодаря автоматически созданным прокси-серверам он может делать практически все, что вы можете себе представить, начиная с создания mocks от интерфейсов, перехватывая завершение инициализации с подавлением статической инициализации (единственное, что избило меня, было возиться с насмешкой 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

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

+0

Говорит страница не найдена, возможно, обновить свой ответ :) – cgew85 2016-01-11 13:58:13