【发布时间】:2015-06-19 03:37:42
【问题描述】:
我遇到了 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 类的模拟,因为这是我正在测试的类。我非常感谢对此的帮助和见解。
【问题讨论】:
-
您不应模拟被测类的方法。你是对的——你不应该嘲笑课堂本身。相反,模拟旨在替换被测类的所有协作者。因此,如果您的类依赖于您的方法中使用其实例的其他类,那么只需模拟掉那些协作者。
-
异常很清楚,act 不是模拟所以没有 when() 。一些doc 你应该阅读恕我直言
标签: java unit-testing junit mockito