Как внедрить макет после Mockito.Mock()

#junit #mockito #junit5 #junit5-extension-model

#junit #mockito #junit5 #junit5-extension-model

Вопрос:

У меня есть абстрактный класс с таким количеством методов с бизнес-логикой. При написании Junits я тестирую абстрактный класс, создавая его макет с вызовами реальных методов. В моем Junit я не хочу создавать конкретный класс для тестирования метода абстрактного класса, потому что тогда мой тестовый пример Junit получит поведение, которого я не хочу.

Я использую это для создания макета для вызова моего абстрактного класса. Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS)

Но моя проблема в том, что мой абстрактный класс имеет так много зависимостей, которые автоматически подключаются. Дочерние классы @component . Теперь, если бы это был не абстрактный класс, я бы использовал @InjectMocks, чтобы внедрить эти фиктивные зависимости. Но как добавить макет к этому экземпляру, я описал выше.

Упрощает версию кода здесь/

 abstract class AbstractService{

       @Autowired
       DependencyOne dp1;
        
       @Autowired
        private DependencyOne dp2;

     
       public void doSometingSpecial(){
          dp1.Dosomething(dp2.dosomethingElse())
         .....
         .....

     }
}
 

Мой Junit

 @ExtendWith(SpringExtension.class)
@TestInstance(Lifecycle.PER_CLASS)
class AbstractServiceTest {

        @Mock
        private DependencyOne dp1;
        
        @Mock
        private DependencyOne dp2;

        .....
         .....

        @Test
        void testDirectCall_whenSomething_thenSomerhing(){
               AbstractService service =    Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS);

        //How to inject dep1 and dp2 mock to write junit for doSometingSpecial()
          }
     }
 

Ответ №1:

просто добавьте inject mock только для родительского класса

 @InjectMocks
AbstractService abstractService;
 

Внутренний метод тестирования дает,

  @Test
 void testDirectCall_whenSomething_thenSomerhing(){
 when(myAbstractClass.doSometingSpecial()).thenReturn("good");
  Assert.assertEquals("good",myAbstractClass.doSometingSpecial());
  }
 

Нет необходимости

 AbstractService service =    Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS);
 

в разделе импорт, пожалуйста, добавьте
import static org.mockito.Mockito.*;

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

1. Как я уже сказал, это не сработает.. Мне нужно протестировать абстрактный класс…. то, что вы сделали, было издевательством над самим тестовым целевым классом……. Я издеваюсь над ним, поскольку он абстрактен, поэтому не могу создать экземпляр……. Мне нужно, чтобы иметь возможность вызывать методы внутри этого class…so CALLS_REAL_METHODS необходимо передавать в качестве аргумента во время насмешки…