2013-02-09 3 views
6

Имея реальное затруднение, пытаясь исправить эту проблему, кто-нибудь может мне помочь?Mockito: проверить (mock) issue

Я явно делаю что-то принципиально неправильное, я пытался проверить каждый объект Mock, но он, похоже, не работает.

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) 

Вот мои тесты

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; 
    } 
} 

Если кто-то может помочь мне, что было бы здорово.

+0

Я попробовал ваш тест с пустыми реализациями ваших классов, и все работает нормально (т.е. без такого исключения , очевидно, тесты не соответствуют их утверждениям). Возможно, вы можете сделать то же самое: прокомментируйте всю реализацию и проверьте, не делает ли это этой проблемой. Затем снова запустите добавление кода и нажмите, чтобы определить, какое добавление вызывает это исключение. Тогда вернитесь к нам, если все еще не ясно, или отправьте ответ самостоятельно, если сможете его решить. – bowmore

ответ

5

Вы пытаетесь использовать метод проверки структуры Mockito неправильно. Он используется для проверки того, что какое-то поведение произошло один раз. В ваших тестах вы должны указать, какое поведение произошло (поведением было вызвано вызов метода).

Вот пример теста, который проверяет, что метод проверяет для отправки почты:

@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); 
    } 

} 

Как вы можете видеть из этого примера, после того, как проверить (..) Уточняю вызов метода, который я хочу проверить. Другими словами, в последней строке примера я проверяю, что во время выполнения метода sendMail (...) моего метода службы send (..) JavaMailSender был вызван с правильными параметрами.

Посмотрите официальную страницу mockito. Существует много простых и полезных примеров с хорошим описанием. Here is a link to it.

0

Сообщение об ошибке предполагает, что у вас есть недостающий вызов verify(em)...; в поврежденном методе тестирования search_OneHourSlot_TwoBookingAvailable().

Я настоятельно рекомендую переформатировать ваш тестовый код, разделяя по крайней мере утверждения из тестового кода в каждом методе тестирования.

+0

Я добавил проверку (em) каждому из методов, но, похоже, она не решает проблему. – user1408682

+1

@ user1408682 вызов 'verify (em)' недостаточно. Вы должны проверить полный вызов метода, например 'verify (em) .method (a)' См. [Mockito API] (http://mockito.googlecode.com/svn/branches/1.5/javadoc/org/mockito/Mockito .html) глава 4. – harpun

0

Добавлена ​​это каждый тест, и он работает, спасибо harpun вы действительно помогли мне здесь

verify(em).createQuery(c); 
    verify(builder).createQuery(Product_Details.class); 
    verify(c).from(Product_Details.class); 
    verify(em).createQuery(c); 
    verify(typedQuery).getResultList(); 
Смежные вопросы