异常:mockito想要但没有被调用,实际上与这个mock没有任何交互



我有接口

Interface MyInterface {
  myMethodToBeVerified (String, String);
}

接口的实现是

class MyClassToBeTested implements MyInterface {
   myMethodToBeVerified(String, String) {
    …….
   }
}

我有另一类

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

我正在尝试为MyClass编写JUnit。我做过

class MyClassTest {
    MyClass myClass = new MyClass();
  
    @Mock
    MyInterface myInterface;
    testAbc(){
         myClass.abc();
         verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
    }
}

但我得到了想要但没有调用的mockito,实际上在验证调用时与这个mock没有任何交互。

有人能提出一些解决方案吗。

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

void testAbc(){
     myClass.myObj = myInteface;
     myClass.abc();
     verify(myInterface).myMethodToBeVerified(new String("a"), new String("b"));
}

尽管将所有初始化代码提取到@Before 中是更明智的选择

@Before
void setUp(){
     myClass = new myClass();
     myClass.myObj = myInteface;
}
@Test
void testAbc(){
     myClass.abc();
     verify(myInterface).myMethodToBeVerified(new String("a"), new String("b"));
}

您的类MyClass创建了一个新的MyClassToBeTested,而不是使用mock。我在Mockito维基上的文章描述了处理这一问题的两种方法。

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

@InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too
@Mock MyInterface myInterface

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

@jk1的答案是完美的,因为@igor Ganapolsky问,为什么我们不能在这里使用Mockito.mock?我发布了这个答案。

为此,我们为myobj提供了一个setter方法,并使用模拟对象设置myobj值。

class MyClass {
    MyInterface myObj;
    public void abc() {
        myObj.myMethodToBeVerified (new String("a"), new String("b"));
    }
    public void setMyObj(MyInterface obj)
    {
        this.myObj=obj;
    }
}

在我们的测试课上,我们必须编写以下代码

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

如果您希望thisMethod()执行,但它没有执行,也可以抛出此异常。它没有,因为它处于一个未满足的条件内。

例如,如果您有一个单元测试,它说验证thisMethod()是否执行,但事实上,这并不是因为varX和varY不相等。

//method expected to be called.    
if( varX == varY){
     thisMethod();
  }
 //test
 Mockito.verify(foo).thisMethod();

相关内容

最新更新