我在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
调用中使用,这与对象的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
,但这实际上是一个品味问题:
@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();
}
}
以下是一些提示:
- 模拟活动
- 使用when/then/doReturn调整secondMethod的行为
- 在调用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确实有副作用,谁知道呢。。。