2016-04-14 3 views
1

Я экспериментирую с преобразованием моего проекта в groovy и хотел бы продолжить использовать JUnit4 с Mockito. У меня есть тест, который проверяет, что вызывает весну вокруг рекомендации, когда я вызываю другой метод.Mockito Matchers в Groovy

Вот мой код:

@Test 
    void testPointCut() { 
    //Given 
    def target = new MainController(); 
    def factory = new AspectJProxyFactory(target); 
    def aspect = mock(LoggingAspect.class); 
    factory.addAspect(aspect); 
    def proxy = factory.getProxy(); 
    when(aspect.log(any(ProceedingJoinPoint))).thenReturn(null); 

    //When 
    proxy.index(); 

    //Then 
    verify(aspect).log(any(ProceedingJoinPoint)); 
    } 

Когда я запускаю это, я получаю исключение:

testPointCut(com.meetupinthemiddle.LoggingAspectTest) Time elapsed: 0.277 sec <<< ERROR! 
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
0 matchers expected, 1 recorded: 
-> at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56) 

This exception may occur if matchers are combined with raw values: 
    //incorrect: 
    someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
    //correct: 
    someMethod(anyObject(), eq("String by matcher")); 

For more info see javadoc for Matchers class. 

     at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:147) 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:164) 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
     at com.meetupinthemiddle.LoggingAspectTest.testPointCut(LoggingAspectTest.groovy:20) 

Но эквивалентный код в Java работает без каких-либо проблемно Любые идеи? Я думаю, что проблема может быть такой же, как эта? Bug in Mockito with Grails/Groovy, но у него нет ответа!

ответ

6

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

Я думаю (как указано в ответе на вопрос, который вы связали), что groovy перехватывает вызов и заменяет его вызовом getMetaClass().

Возможные доказательства этого в том, что ошибка говорит о том, что «0 матчей ожидаются», когда у вас явно есть совпадения в вашем методе.

Смежные вопросы