我面临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类的模拟,因为这是我正在测试的类。我真的很感谢你的帮助和见解。
在这个例子中没有理由嘲笑任何东西。因为没有依赖关系,而且两个方法都是公共的,所以您可以直接测试它们。
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实际上有副作用,谁知道呢...
正如您所注意到的,< 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();
}
}