Mockito NotaMockException

2022-09-01 11:42:19

我遇到了Mockito junit测试的问题。我是新手,对我面临的问题有点困惑。任何这方面的帮助将不胜感激。

class Activity{

    public void firstMethod(){

      String str = secondMethod();
   }

    public String secondMethod(){
      String str = null;

      /*  some Code */

      return str;
   }
}

获取异常 :

*org.mockito.exceptions.misusing.NotAMockException: 
 Argument passed to when() is not a mock!*

在下面的代码中

class ActivityTest(){

  Activity act;

  @Before
  public void setup(){
     act = new Activity();
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn(Mockito.anyString()).when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

我知道活动不是模拟的,但我不确定是否有办法解决这个问题,就像同一类中的方法一样。我需要编写规则,因为我已经完成了它的单元测试。包含的定义具有外部依赖关系。我应该嘲笑中存在的外部依赖关系并为它们编写规则而不是规则吗?secondMethod()secondMethod()secondMethod()secondMethod()secondMethod()

我发现这篇文章: Mockito Spy'ing on the object be unit tested 但是将第二个Method()分成不同的类是没有意义的。我的方法与此类相关。创建一个不同的测试类对我来说似乎并不合适。即使使用spy()嘲笑实际的类也不是最正确的方法,正如帖子中已经解释的那样。

我不认为我应该创建一个Active类的模拟,因为这是我正在测试的类。我非常感谢对此的帮助和见解。


答案 1

如您所见,不是模拟,因此您无法记录其行为。您可以使用 Mockito.spy 来监视(或部分模拟)对象,以便仅记录 的行为并执行 .actactsecondMethodfirstMethod

但请注意,无论您如何处理或处理对象,都无法在呼叫中使用匹配器。返回值必须是具体对象。doReturnmockspy

class ActivityTest() {

  Activity act;

  @Before
  public void setup(){
     act = Mockito.spy(new Activity()); // Here!
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn("someString").when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

稍微优雅的语法允许您使用注释而不是显式调用 ,但这实际上是一个品味问题:Mockito.spy

@RunWith(MockitoJUnitRunner.class)
class ActivityTest() {

  @Spy
  Activity act = new Activity();

  @Test
  public void testFirstMethod(){

      Mockito.doReturn("someString").when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

答案 2

以下是一些提示:

  1. 模拟活动。
  2. 调整 secondMethod 的行为,当 / 然后 / doReturn
  3. 在调用 firstMethod 时使用 doCallRealMethod。

希望它有帮助。


推荐