可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
  I have interface
  Interface MyInterface {   myMethodToBeVerified (String, String); } 
  And implementation of interface is
  class MyClassToBeTested implements MyInterface {    myMethodToBeVerified(String, String) {     …….    } } 
  I have another class
  class MyClass {     MyInterface myObj = new MyClassToBeTested();     public void abc(){          myObj.myMethodToBeVerified (new String(“a”), new String(“b”));     } 
  }
  I am trying to write JUnit for MyClass. I have done 
  class MyClassTest {     MyClass myClass = new MyClass();      @Mock     MyInterface myInterface;      testAbc(){          myClass.abc();          verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));     } } 
  But I am getting       mockito wanted but not invoked, Actually there were zero interactions with this mock at verify call.
  can anyone suggest some solutions.
      回答1:
 You need to inject mock inside the class you're testing. At the moment you're interacting with the real object, not with the mock one. You can fix the code in a following way:
  void testAbc(){      myClass.myObj = myInteface;      myClass.abc();      verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”)); } 
  although it would be a wiser choice to extract all initialization code into @Before
  @Before void setUp(){      myClass = new myClass();      myClass.myObj = myInteface; }  @Test void testAbc(){      myClass.abc();      verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”)); } 
      回答2:
 Your class MyClass creates a new MyClassToBeTested, instead of using your mock.  My article on the Mockito wiki describes two ways of dealing with this.
      回答3:
 @Jk1's answer is fine, but Mockito also allows for more succinct injection using annotations:
  @InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too @Mock MyInterface myInterface 
  But regardless of which method you use, the annotations are not being processed (not even your @Mock) unless you somehow call the static MockitoAnnotation.initMocks() or annotate the class with @RunWith(MockitoJUnitRunner.class).
      回答4:
 @jk1 answer is perfect, since @igor Ganapolsky asked, why can't we use Mockito.mock here? i post this answer.
  For that we have provide one setter method for myobj and set the myobj value with mocked object.
  class MyClass {     MyInterface myObj;      public void abc() {         myObj.myMethodToBeVerified (new String(“a”), new String(“b”));     }      public void setMyObj(MyInterface obj)     {         this.myObj=obj;     } } 
  In our Test class, we have to write below code
  class MyClassTest {  MyClass myClass = new MyClass();      @Mock     MyInterface myInterface;      @test     testAbc() {         myclass.setMyObj(myInterface); //it is good to have in @before method         myClass.abc();         verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));      } }