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不是mock,但我不确定是否有办法绕过它,因为secondMethod()是同一类中的方法。我需要为secondMethod()编写规则,因为我已经完成了它的单元测试。secondMethod()的定义包含外部依赖关系。我应该嘲笑secondMethod()中存在的外部依赖关系,并为它们编写规则而不是为secondMethod()编写规则吗?

我发现了这个帖子:Mockito间谍';正在进行单元测试的对象然而,将secondMethod()分离到不同的类中是没有意义的。我的方法与这个类有关。创建一个不同的类进行测试对我来说似乎并不正确。即使使用spy()来嘲笑实际的类也不是最正确的方法,正如文章中已经解释的那样。

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

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

但是,请注意,匹配器不能在doReturn调用中使用,这与对象的mockspy有关。返回值必须是一个具体对象。

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. 模拟活动
  2. 使用when/then/doReturn调整secondMethod的行为
  3. 在调用firstMethod时使用doCallRealMethod

希望能有所帮助。

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

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确实有副作用,谁知道呢。。。

相关内容

  • 没有找到相关文章

最新更新