gpt4 book ai didi

java - Mockito NotaMockException

转载 作者:太空狗 更新时间:2023-10-29 22:51:23 26 4
gpt4 key购买 nike

我遇到了 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 不是模拟,但我不确定是否有解决方法,因为 secondMethod() 是同一类中的一个方法。我需要为 secondMethod() 编写规则,因为我已经完成了它的单元测试。 secondMethod() 的定义包含外部依赖性。我应该模拟 secondMethod() 中存在的外部依赖项并为它们编写规则而不是为 secondMethod() 编写规则吗?

我找到这篇文章: Mockito Spy'ing on the object being unit tested然而,将 secondMethod() 分离到不同的类中是没有意义的。我的方法与这个类有关。为测试创建一个不同的类对我来说似乎不合适。即使使用 spy() 模拟实际类也不是最正确的方法,正如帖子中已经解释的那样。

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

最佳答案

如您所述,act 不是模拟,因此您无法记录其行为。你可以使用 Mockito.spy好吧,监视(或部分模拟)act 对象,以便您只记录 secondMethod 的行为并执行 firstMethod 的实际代码.

但是请注意,无论您如何模拟监视您的匹配器,都不能在 doReturn 调用中使用目的。返回值必须是具体对象。

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();
}
}

关于java - Mockito NotaMockException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29611893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com