例外:mockito想要但未被调用,实际上与这个模拟没有交互

use*_*719 28 java unit-testing mockito

我有界面

Interface MyInterface {
  myMethodToBeVerified (String, String);
}
Run Code Online (Sandbox Code Playgroud)

并且接口的实现是

class MyClassToBeTested implements MyInterface {
   myMethodToBeVerified(String, String) {
    …….
   }
}
Run Code Online (Sandbox Code Playgroud)

我有另一堂课

class MyClass {
    MyInterface myObj = new MyClassToBeTested();
    public void abc(){
         myObj.myMethodToBeVerified (new String(“a”), new String(“b”));
    }
Run Code Online (Sandbox Code Playgroud)

}

我正在尝试为MyClass编写JUnit.我已经做好了

class MyClassTest {
    MyClass myClass = new MyClass();

    @Mock
    MyInterface myInterface;

    testAbc(){
         myClass.abc();
         verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我想得到 mockito但是没有被调用,实际上在验证调用时没有与这个模拟器进行零交互.

谁能建议一些解决方案.

Jk1*_*Jk1 15

你需要在你正在测试的类中注入mock.此刻,您正在与真实对象进行交互,而不是与模拟对象进行交互.您可以通过以下方式修复代码:

void testAbc(){
     myClass.myObj = myInteface;
     myClass.abc();
     verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
Run Code Online (Sandbox Code Playgroud)

虽然将所有初始化代码提取到@Before是一个更明智的选择

@Before
void setUp(){
     myClass = new myClass();
     myClass.myObj = myInteface;
}

@Test
void testAbc(){
     myClass.abc();
     verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
Run Code Online (Sandbox Code Playgroud)


Kev*_*ker 7

@Jk1 的回答很好,但 Mockito 还允许使用注释进行更简洁的注入:

@InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too
@Mock MyInterface myInterface
Run Code Online (Sandbox Code Playgroud)

但是无论您使用哪种方法,都不会处理注释(甚至不是您的@Mock),除非您以某种方式调用静态MockitoAnnotation.initMocks()或使用@RunWith(MockitoJUnitRunner.class).


Daw*_*ica 7

你的类MyClass创建一个新的MyClassToBeTested,而不是使用你的模拟. 我在Mockito wiki上的文章描述了两种处理这个问题的方法.