Mockito NotaMockException

时间:2015-04-13 17:56:52

标签: java unit-testing junit mockito

我正面临着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 being unit tested 但是将secondMethod()分成不同的类是没有意义的。我的方法与这个类有关。创建一个不同的测试类对我来说似乎不对。即使使用spy()模拟实际类也不是最正确的方法,如帖子中所述。

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

3 个答案:

答案 0 :(得分:24)

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

但是,请注意,匹配器无法用于doReturn调用您mock或{{}}对象的方式。返回值必须是具体对象。

spy

稍微优雅的语法允许您使用注释而不是显式调用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

答案 1 :(得分:0)

以下是一些提示:

  1. 模拟活动。
  2. 使用/ then / doReturn
  3. 调整secondMethod的行为
  4. 调用firstMethod时使用doCallRealMethod。
  5. 希望它有所帮助。

答案 2 :(得分:0)

在此示例中,没有理由模拟任何内容。由于没有依赖项,并且这两种方法都是公共的,因此您可以直接对其进行测试。

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实例没有任何可检测的影响,也对任何依赖项(因为没有依赖项)都没有可检测的作用,因此您可以简单地调用该方法,并在不引发任何异常的情况下感到满意。也可能会导致根本不应该测试这种方法。

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