我正面临着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类的模拟,因为那是我正在测试的类。我非常感谢对此的帮助和见解。
答案 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)
以下是一些提示:
希望它有所帮助。
答案 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实际上确实有副作用,谁知道...