Ошибка при написании модульного теста Mockito с @Spy для класса Groovy, который расширяет абстрактный класс

#java #groovy #mockito #junit5

#java #groovy #mockito #junit5

Вопрос:

Я сталкиваюсь с проблемой при запуске Mockito Unit теста с @Spy Groovy помощью класса for, который расширяет abstract класс. Эта ошибка не возникает, если я удаляю abstract или создаю родительский класс как обычный Java класс. В чем может быть проблема?

     abstract class ClassA
    {
    }
    
    @Component
    class ClassB extends ClassA
    {
        void validateBeforeCreate(String arg1, Object arg2)
        {
            check(arg1, arg2)
        }
    
        protected void check(String arg1, Object arg2)
        {
            // some validation logic
        }
    }
    
    @ExtendWith(MockitoExtension)
    class ClassBTest
    {
        @Spy
        @InjectMocks
        private ClassB classB
    
        @Test
        void testValidateBeforeCreate_Success()
        {
            String arg1 = "test"
            Object arg2 = new Object()
    
            doNothing().when(classB).check(arg1, arg2)
    
            assertDoesNotThrow({ classB.validateBeforeCreate(arg1, arg2) } as Executable)
        }
    }

  
 Only void methods can doNothing()!
Example of correct use of doNothing():
    doNothing().
    doThrow(new RuntimeException())
    .when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
org.mockito.exceptions.base.MockitoException: 
Only void methods can doNothing()!
Example of correct use of doNothing():
    doNothing().
    doThrow(new RuntimeException())
    .when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:146)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:163)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
    at com.tr.cws.workflow.trigger.test.ClassBTest.testValidateBeforeCreate_Success(ClassBTest.groovy:25)
  

Комментарии:

1. Какие версии Groovy и Mockito? Это будет важно для других, чтобы попытаться воспроизвести.

2. Его можно воспроизвести с помощью Groovy 2.5.6 и Mockito 2.24.5.