Mockito NotaMockException

lea*_*hru 17 java junit unit-testing mockito

我正面临着Mockito junit测试的问题.我是新手,我对我面临的问题感到困惑.任何有关这方面的帮助将不胜感激.

class Activity{

    public void firstMethod(){

      String str = secondMethod();
   }

    public String secondMethod(){
      String str = null;

      /*  some Code */

      return str;
   }
}
Run Code Online (Sandbox Code Playgroud)

获得例外:

*org.mockito.exceptions.misusing.NotAMockException: 
 Argument passed to when() is not a mock!*
Run Code Online (Sandbox Code Playgroud)

在下面的代码中

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();
  }
} 
Run Code Online (Sandbox Code Playgroud)

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

我发现这篇文章: Mockito Spy'ing对被单元测试的对象 然而将secondMethod()分成另一个类是没有意义的.我的方法与这个类有关.创建一个不同的测试类对我来说似乎不对.即使使用spy()模拟实际类也不是最正确的方法,正如帖子中已经解释过的那样.

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

Mur*_*nik 30

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

但是请注意,这匹配器不能使用doReturn你如何调用regardles 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();
  }
} 
Run Code Online (Sandbox Code Playgroud)

稍微优雅的语法允许您使用注释而不是显式调用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();
  }
} 
Run Code Online (Sandbox Code Playgroud)