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

Mockito NotaMockException

郑西岭
2023-03-14

我面临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()是同一类中的一种方法。我需要为第二方法()编写规则,因为我已经完成了它的单元测试。第二方法()的定义由外部依赖关系组成。我是否应该嘲笑第二方法()中存在的外部依赖关系并为它们编写规则,而不是为第二方法()编写规则?

我发现了这篇文章:Mockito对正在进行单元测试的对象进行间谍活动。然而,将第二个方法()分离到不同的类中是没有意义的。我的方法与这个类相关。创建一个不同的类进行测试对我来说似乎不太合适。就像在文章中已经解释的那样,即使使用spy()来嘲笑实际的类也不是最正确的方法。

我不认为我应该创建一个Activity类的模拟,因为这是我正在测试的类。我真的很感谢你的帮助和见解。

共有3个答案

拓拔玺
2023-03-14

在这个例子中没有理由嘲笑任何东西。因为没有依赖关系,而且两个方法都是公共的,所以您可以直接测试它们。

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实际上有副作用,谁知道呢...

温星华
2023-03-14

以下是一些提示:

  1. 模拟活动。
  2. 调整第二方法的行为与何时/然后/do返回
  3. 在调用第一个方法时使用 doCall真实方法。

希望有帮助。

左博学
2023-03-14

正如您所注意到的,< code>act不是一个模仿,因此您不能在它上面记录行为。您可以使用< code>Mockito.spy来窥探(或部分模仿)< code>act对象,以便您只记录< code>secondMethod的行为,并执行< code>firstMethod的实际代码。

但是,请注意,匹配器不能用于doReturn调用中,因为它们与模拟ing或监视对象的方式有关。返回值必须是具体对象。

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();
  }
} 
 类似资料:

相关问答

相关文章

相关阅读