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


当前回答

@Mock注释模拟相关对象。

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

两者是相辅相成的。

其他回答

使用@Tom提到的方法的一个好处是,您不必在SomeManager中创建任何构造函数,从而限制客户端实例化它。

@RunWith(MockitoJUnitRunner.class)
public class SomeManagerTest {

    @InjectMocks
    private SomeManager someManager;

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

    //You don't need to instantiate the SomeManager with default contructor at all
   //SomeManager someManager = new SomeManager();    
   //Or SomeManager someManager = new SomeManager(someDependency);

     //tests...

}

这是否是一个好的实践取决于你的应用程序设计。

在您的测试类中,被测试的类应该使用@InjectMocks进行注释。这告诉Mockito将mock注入到哪个类中:

@InjectMocks
private SomeManager someManager;

从那时起,我们可以在类中指定特定的方法或对象,在这种情况下,SomeManager将被mock取代:

@Mock
private SomeDependency someDependency;

在这个例子中,SomeManager类中的SomeDependency将被模拟。

可以使用@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用于声明/模拟依赖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(){

   }

}

很多人已经在这里给出了关于@Mock和@InjectMocks的很好的解释。我喜欢它,但我认为我们的测试和应用程序应该以这样一种方式编写,我们不应该使用@InjectMocks。

进一步阅读的示例参考:https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/