首页 > 解决方案 > 如何在 Mockito.Mock() 之后注入 Mock

问题描述

我有一个抽象类,其中包含许多具有业务逻辑的方法。在编写 Junits 时,我正在通过调用真实方法创建其 Mock 来测试抽象类。在我的 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()
          }
     }

标签: junitmockitojunit5junit5-extension-model

解决方案


只需为父类添加注入模拟

@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.*;


推荐阅读