当前位置: 首页 > 知识库问答 >
问题:

mockito中的org.mockito.exceptions.misusing.MissingMethodInvocationException

武琛
2023-03-14

我有一个简单的控制器类

@RestController
open class MyController() {

@Autowired
lateinit var myInterface: MyInterface

@GetMapping(value = ["/v1/call-Api"], produces = ["application/json"])
fun getData():Response{
   callFx()
   /// Here I have logic
 }

  fun callFx():String{
    return myInterface.getmyStringData()
  }
}

现在,我们来谈谈实施的一部分

MyInterface

@Service
class MyImpl: MyInterface {
  override fun getmyStringData(){
        return "Some string"
    }
}

请注意,对于MyInterface,我只有一个实现类。

现在来到控制器类的测试用例

class ControllerTest{

@Autowired
lateinit var myIntF: Myinterface


@Test
fun controllerTest(){         
Mockito.`when`(myIntF.getmyStringData()).thenReturn("Some mock string")
// Some code over here
}

}

在所有这些之后,我一直在犯错误

  org.mockito.exceptions.misusing.MissingMethodInvocationException: 
  when() requires an argument which has to be 'a method call on a mock'.
  For example:
  when(mock.getArticles()).thenReturn(articles);

  Also, this error might show up because:
  1. you stub either of: final/private/equals()/hashCode() methods.
  Those methods *cannot* be stubbed/verified.
  Mocking methods declared on non-public parent classes is not supported.
  2. inside when() you don't call method on mock but on some other object.

尽管代码语法属于Kotlin,但我保持简单,以详细说明我的场景。任何一个JAVA的家伙都可以帮助我。

任何帮助都会对我很有帮助。

共有1个答案

彭成天
2023-03-14

问题:

下面是你的测试课

class ControllerTest{

@Autowired
lateinit var myIntF: MyInterface


@Test
fun controllerTest(){         
Mockito.`when`(myIntF.getmyStringData()).thenReturn("Some mock string")
// Some code over here
}

由于您使用了@Autowired,因此使用的是真正的实现,而不是模拟对象,因此当您执行Mockito.when(myIntF.getmyStringData()).thenReturn(“某个模拟字符串”),则会出现错误when()需要一个参数,该参数必须是“模拟的方法调用”。这是因为myIntF不是模拟对象。

解决方案:

首先,由于它是一个控制器测试,您需要用@InjectMocks注释控制器字段,以便将模拟的MyInterfaceobj注入其中。然后,您需要用@Mock注释MyInterface字段,这将创建一个模拟对象。然后,您需要使用MockitoAnnotations.initMocks(this)来初始化用Mockito注释注释的对象。只有在这之后,方法调用mocking时使用Mockito.when(mockedObject.methodCall).thenReturn(mockedValue)才能工作。

class ControllerTest{

@InjectMocks
lateinit var controller: MyController

@Mock
lateinit var myIntF: MyInterface

@BeforeEach
fun init() {
    MockitoAnnotations.initMocks(this)
}


@Test
fun controllerTest(){         
    Mockito.`when`(myIntF.getmyStringData()).thenReturn("Some mock string")
    // Some code over here
    controller.callFx() //this would return "Some mock string"
}
 类似资料:
  • 本文向大家介绍mockito 简单的最小Mockito测试,包括了mockito 简单的最小Mockito测试的使用技巧和注意事项,需要的朋友参考一下 示例 此示例显示了使用嘲笑的最小Mockito测试ArrayList:            

  • Mockito 是一个针对 Java 的 mocking 框架。它与 EasyMock 和 jMock 很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。

  • 在我的实现类中,我有一个读写锁定义,如下所示, 我在一个名为的方法中使用它, 正如我所说的,是null,但是rwLock是初始化的。请解释Mockito是如何发生这种情况的。理想的方法是什么?

  • 当我试图在单元测试中窥探一个对象时,我得到了一个异常。这是我的单元测试文件: 我在assign bookInfoParams Spy链接处遇到异常:

  • 在我的项目中,我们已经有mockito核心依赖项。我想存根静态方法,我需要为其添加mockito内联依赖项。所以想了解它们之间的区别。它们可以共存吗?