Mockito NotaMockException

Mockito NotaMockException

我遇到了 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();
  }
} 

我知道 activity 不是模拟,但我不确定是否有解决方法,因为 secondMethod() 是同一个 class 中的一个方法。我需要为 secondMethod() 编写规则,因为我已经完成了它的单元测试。 secondMethod() consists 的定义具有外部依赖性。我应该模拟 secondMethod() 中存在的外部依赖项并为它们编写规则而不是 secondMethod() 的规则吗?

我找到了这个 post: Mockito Spy'ing on the object being unit tested 然而,将 secondMethod() 分成不同的 class 没有意义。我的方法和这个有关class。为测试创建一个不同的 class 对我来说似乎不合适。即使使用 spy() 模拟实际的 class 也不是最正确的方法,正如 post.

中已经解释的那样

我认为我不应该创建 Activity class 的模拟,因为那是我正在测试的 class。我真的很感激对此的帮助和见解。

如您所述,act 不是模拟,因此您无法记录其行为。您可以使用 Mockito.spy 来监视(或部分模拟)act 对象,以便您只记录 secondMethod 的行为并执行 firstMethod 的实际代码。

但是请注意,无论您如何 mocking 或 spying 您的对象,都不能在 doReturn 调用中使用匹配器。 return 值必须是具体对象。

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

这里有一些提示:

  1. 模拟 Activity。
  2. 用 when / then / doReturn 调整 secondMethod 的行为
  3. 调用 firstMethod 时使用 doCallRealMethod。

希望对您有所帮助。

在此示例中没有理由模拟任何内容。由于没有依赖关系,两种方法都是public,可以直接测试

public class ActivityTest() {

    private Activity act = new Activity();

    @Test
    public void testSecondMethod(){
        assertEquals("expected-value", act.secondMethod());
    }

    @Test
    public void testFirstMethod() {
        act.firstMethod();
        // success if no exception occurs
    }
} 

由于 firstMethod 对 Act 实例和任何依赖项都没有任何可检测的影响(因为存在 none),您可以简单地调用该方法,如果没有抛出异常就可以满足。也可以认为根本不应该测试这种方法。

我假设给出的示例是 class 的简化,其中调用 firstMethod 实际上确实有副作用,谁知道...