Как обмануть EntityManager?
Мне нужно фальсифицировать сущность-менеджер, чтобы сделать уровень сервиса тестирования (в моем случае фасадом сеанса) независимым от базового слоя (который в моем случае является менеджером сущностей).
Итак, как я могу это сделать? следует ли использовать dbunit? мне нужен простой /j (Mock)? пожалуйста, помогите.
Ответы
Ответ 1
Я предлагаю использовать 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
Ответ 2
Для насмешек я предлагаю 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();
}
}
(Примечание: я написал его здесь, поэтому может даже не компилироваться, но должен дать вам идею).
Ответ 3
Я обычно использую EasyMock для насмешливой реализации конкретного сервиса в тестовых случаях. Ознакомьтесь с их руководством пользователя. Он включает в себя очень простое пошаговое руководство, в котором объясняются основные понятия, лежащие в основе насмешливых фреймворков в целом, и быстро запускается с EasyMock.