Witam,zacząłem pisać parę bardziej skomplikowanych testów i próbuje zrozumieć jaki (czy w ogóle w tym przypadku) sens ma stosowanie Mockito.
Chce przetestować metodę, zwraca ona liczbę wierszy:
@Repository
@Transactional
public class MSSqlGameStoreDatabase implements DatabaseRepository {
@PersistenceContext
private EntityManager entityManager;
public long getNumberOfRows(){
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = builder.createQuery( Long.class );
criteria.select( builder.count( criteria.from( Game.class ) ) );
Long value = entityManager.createQuery(criteria).getSingleResult();
return value;
}
}
Moja klasa testowa:
@RunWith(MockitoJUnitRunner.class)
public class MSSqlGameStoreDatabaseTest {
@Mock
EntityManager mockedEM;
@Mock
private CriteriaBuilder mockedCB;
@Mock
private CriteriaQuery mockedCQ;
MSSqlGameStoreDatabase mSSqlGameStoreDatabase;
public MSSqlGameStoreDatabaseTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
mSSqlGameStoreDatabase = new MSSqlGameStoreDatabase(mockedEM);
when(mockedEM.getCriteriaBuilder()).thenReturn(mockedCB );
when(mockedCB.createQuery(Long.class)).thenReturn(mockedCQ);
when(mockedEM.createQuery(mockedCQ).getSingleResult() ).
thenReturn( mockedCQ.select( mockedCB.count( mockedCQ.from( Game.class ) )));
}
/**
* Test of getNumberOfRows method, of class MSSqlGameStoreDatabase.
*/
@Test
public void testGetNumberOfRows() {
Long value = mSSqlGameStoreDatabase.getNumberOfRows();
assertEquals( 16, value.longValue() );
}
}
Oczywiście zdaje sobie sprawę z tego, że ten test to same bzdury, ale obecnie to jest w takiej formie. Mogę prosić o odpowiedź na parę pytań?
- Tłumacząc łopatologicznie: metoda when działa dla linijki: "when(mockedEM.getCriteriaBuilder()).thenReturn(mockedCB );" tak:
"*Dla zmockowanego obiektu **mockedEM **po wykonaniu metody **getCriteriaBuilder ** zwróć **mockedCB *bez względu na to co zostało faktycznie zwrócone"? - Skąd mockito wie jak zrobić mock mockedEM, **mockedCB **itd.?
- Czemu podczas przeprowadzania testu bez mokowania (bez adnotacji "@RunWith(MockitoJUnitRunner.class)") wywala NullPointerException przy
CriteriaBuilder builder = entityManager.getCriteriaBuilder();? - Jak poprawnie zrobić test tej motody?
- Czy używanie CriteriaBuilder i CriteriaQuery jest lepszym pomysłem od napisania zwykłego Query w SQL?