Exception : mockito wanted but not invoked, Actually there were zero interactions with this mock

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

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”));      } } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!