Mockito: verify(mock) issue
You are trying to use verify method of Mockito framework in wrong way. It is used to verify that some behaviour happened once. In your tests you should specify what behaviour have happened (by behaviour meant method call).
Here is an example of test that checks that checks method for sending mails:
@RunWith(MockitoJUnitRunner.class)
public class MailSenderTest {
@Mock
private JavaMailSender javaMailSender;
@InjectMocks
private MailSenderImpl mailSender;
@Test
public void testSendMail() {
String from = "[email protected]";
String to = "[email protected]";
String title = "Test";
String text = "Hello world!";
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(title);
message.setText(text);
mailSender.sendMail(to, title, text);
Mockito.verify(javaMailSender).send(message);
}
}
As you can see from this example after verify(..) I specify method call that I want to check. In other words by last row of example I check that during execution of the sendMail(...) method of my service method send(..) of the JavaMailSender have been called with correct parameters.
Look at the mockito official page. There are a lot of simple and usefull examples with good description. Here is a link to it.
user1408682
Updated on June 04, 2022Comments
-
user1408682 almost 2 years
Having real hard time trying to fix this issue could anyone help me please?
I am clearly doing something fundamently wrong i have tried to verify each Mock object but it doesn't seem to work.
org.mockito.exceptions.misusing.UnfinishedVerificationException: Missing method call for verify(mock) here: -> at com.muuves.reservosity.service.TestProductServiceImpl.search_OneHourSlot_TwoBookingAvailable(TestProductServiceImpl.java:86) Example of correct verification: verify(mock).doSomething() Also, this error might show up because you verify either of: final/private/equals() /hashCode() methods. Those methods *cannot* be stubbed/verified. at com.muuves.reservosity.service.TestProductServiceImpl.setUp(TestProductServiceImpl.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Here are my tests
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; public class TestProductServiceImpl { ProductServiceImpl instance; @Mock EntityManager em; @Mock CriteriaBuilder builder; @Mock CriteriaQuery<Product_Details> c; @Mock Root<Product_Details> productRoot; @Mock TypedQuery<Product_Details> typedQuery; @Before public void setUp() { MockitoAnnotations.initMocks(this); instance = new ProductServiceImpl(); instance.setEm(em); instance.setCriteriaBuilder(builder); instance.setQuery(c); instance.setProductRoot(productRoot); instance.setTypedQuery(typedQuery); } @Test public void search_OneHourSlot_NoBookingAvailable() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("14:00-15:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(0, result.size()); } @Test public void search_OneHourSlot_TwoBookingAvailable() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("14:00-17:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(1, result.size()); Assert.assertEquals("2013-02-09 15:00", result.get(0).getTime()); Assert.assertEquals("Google", result.get(0).getProductDetails().getProduct_Name()); } @Test public void search_OneHourSlot_EndTimeAfterClosing() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("14:00-20:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(1, result.size()); Assert.assertEquals("2013-02-09 15:00", result.get(0).getTime()); Assert.assertEquals("Google", result.get(0).getProductDetails().getProduct_Name()); verify(em); } @Test public void search__StartTimeBeforeOpening() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("08:00-13:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(3, result.size()); Assert.assertEquals("2013-02-09 09:00", result.get(0).getTime()); Assert.assertEquals("Google", result.get(0).getProductDetails().getProduct_Name()); Assert.assertEquals("2013-02-09 10:00", result.get(1).getTime()); Assert.assertEquals("Google", result.get(1).getProductDetails().getProduct_Name()); Assert.assertEquals("2013-02-09 11:00", result.get(2).getTime()); Assert.assertEquals("Google", result.get(2).getProductDetails().getProduct_Name()); } @Test public void search__StartTimeAndEndTimeBeforeOpening() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("06:00-09:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(0, result.size()); } @Test public void search__StartTimeAndEndTimeAfterClosing() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("17:00-21:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(0, result.size()); } @Test public void search__StartTimeAndEndTimeExactlyOpeningClosing() { List<Product_Details> products = booking(60); when(em.getCriteriaBuilder()).thenReturn(builder); when(builder.createQuery(Product_Details.class)).thenReturn(c); when(c.from(Product_Details.class)).thenReturn(productRoot); when(em.createQuery(c)).thenReturn(typedQuery); when(typedQuery.getResultList()).thenReturn(products); Search search = new Search(); search.setDate("2013-02-09"); search.setLocation("Cork"); search.setPrice("20"); search.setTime("09:00-17:00"); search.setType("Football"); List<Search_Result> result = instance.search(search); Assert.assertEquals(5, result.size()); Assert.assertEquals("2013-02-09 09:00", result.get(0).getTime()); Assert.assertEquals("Google", result.get(0).getProductDetails().getProduct_Name()); Assert.assertEquals("2013-02-09 10:00", result.get(1).getTime()); Assert.assertEquals("Google", result.get(1).getProductDetails().getProduct_Name()); Assert.assertEquals("2013-02-09 11:00", result.get(2).getTime()); Assert.assertEquals("Google", result.get(2).getProductDetails().getProduct_Name()); Assert.assertEquals("2013-02-09 13:00", result.get(3).getTime()); Assert.assertEquals("Google", result.get(3).getProductDetails().getProduct_Name()); Assert.assertEquals("2013-02-09 15:00", result.get(4).getTime()); Assert.assertEquals("Google", result.get(4).getProductDetails().getProduct_Name()); } private List<Product_Details> booking(int slot){ List<Product_Details> products = new ArrayList<Product_Details>(); Product_Details product = new Product_Details(); product.setProduct_Name("Google"); product.setSaturday_Open("09:00-17:00"); product.setDates_Closed("2013-12-25"); product.setTime_Per_Slot(slot); List<Booking_Details> bookings = new ArrayList<Booking_Details>(); Booking_Details booking1 = new Booking_Details(); booking1.setBooked_Date("2013-02-09 12:00"); bookings.add(booking1); Booking_Details booking2 = new Booking_Details(); booking2.setBooked_Date("2013-02-09 14:00"); bookings.add(booking2); Booking_Details booking3 = new Booking_Details(); booking3.setBooked_Date("2013-02-09 16:00"); bookings.add(booking3); product.setBookings(bookings); products.add(product); return products; } }
If somebody could help me that would be great.
-
bowmore about 11 yearsI've tried your test with empty implementations of your classes and everything runs fine (i.e. without this kind of exception, obviously the tests fail their assertions). Perhaps you could do the same : comment out all implementation and check if that makes this problem go awway. Then start adding code again andtry to pinpoint what addition causes this exception to occur. Then get back to us if it still isn't clear, or post the answer yourself if you can resolve it.
-
-
user1408682 about 11 yearsI have added verify(em) to each of the method but it doesn't seem to solve the problem
-
harpun about 11 years@user1408682 calling
verify(em)
is not enough. You have to verify a full method call, likeverify(em).method(a)
See Mockito API chapter 4.