在Mockito框架中@Mock和@InjectMocks之间有什么区别?


当前回答

@Mock创建一个mock。@InjectMocks创建类的一个实例,并将使用@Mock(或@Spy)注释创建的模拟注入到该实例中。

注意,您必须使用@RunWith(MockitoJUnitRunner.class)或Mockito.initMocks(this)来初始化这些模拟并注入它们(JUnit 4)。

在JUnit 5中,必须使用@ExtendWith(MockitoExtension.class)。

@RunWith(MockitoJUnitRunner.class) // JUnit 4
// @ExtendWith(MockitoExtension.class) for JUnit 5
public class SomeManagerTest {

    @InjectMocks
    private SomeManager someManager;

    @Mock
    private SomeDependency someDependency; // this will be injected into someManager
 
     // tests...

}

其他回答

@Mock创建一个mock。@InjectMocks创建类的一个实例,并将使用@Mock(或@Spy)注释创建的模拟注入到该实例中。

注意,您必须使用@RunWith(MockitoJUnitRunner.class)或Mockito.initMocks(this)来初始化这些模拟并注入它们(JUnit 4)。

在JUnit 5中,必须使用@ExtendWith(MockitoExtension.class)。

@RunWith(MockitoJUnitRunner.class) // JUnit 4
// @ExtendWith(MockitoExtension.class) for JUnit 5
public class SomeManagerTest {

    @InjectMocks
    private SomeManager someManager;

    @Mock
    private SomeDependency someDependency; // this will be injected into someManager
 
     // tests...

}

可以使用@InjectMocks注释自动将模拟字段注入到测试对象中。

在下面的例子中,@InjectMocks用于将模拟数据映射注入到数据库中。

@Mock
Map<String, String> dataMap ;

@InjectMocks
DataLibrary dataLibrary = new DataLibrary();


    @Test
    public void whenUseInjectMocksAnnotation_() {
        Mockito.when(dataMap .get("aData")).thenReturn("aMeaning");

        assertEquals("aMeaning", dataLibrary .getMeaning("aData"));
    }

@Mock用于创建和注入模拟实例,而无需调用Mockito。手动模拟。在本例中,实例是ClassB。

而@InjectMocks用于自动将模拟字段注入到测试对象中。在这种情况下,它将是a类

@Mock注释模拟相关对象。

@InjectMocks注释允许将@Mock创建的不同(和相关的)模拟注入到底层对象中。

两者是相辅相成的。

@Mock用于声明/模拟依赖bean的引用,而@InjectMocks用于模拟正在为其创建测试的bean。

例如:

public class A{

   public class B b;

   public void doSomething(){

   }

}

A类测试:

public class TestClassA{

   @Mocks
   public class B b;

   @InjectMocks
   public class A a;

   @Test
   public testDoSomething(){

   }

}