lea*_*hru 17 java junit unit-testing mockito
我正面临着Mockito junit测试的问题.我是新手,我对我面临的问题感到困惑.任何有关这方面的帮助将不胜感激.
class Activity{
public void firstMethod(){
String str = secondMethod();
}
public String secondMethod(){
String str = null;
/* some Code */
return str;
}
}
Run Code Online (Sandbox Code Playgroud)
获得例外:
*org.mockito.exceptions.misusing.NotAMockException:
Argument passed to when() is not a mock!*
Run Code Online (Sandbox Code Playgroud)
在下面的代码中
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道活动不是模拟,但我不确定如何解决这个问题,因为secondMethod()同一个类中的方法.我需要编写规则,secondMethod()因为我已经完成了单元测试.组合的定义secondMethod()具有外部依赖性.我应该嘲笑存在的外部依赖关系secondMethod()并为它们编写规则而不是规则secondMethod()吗?
我发现这篇文章: Mockito Spy'ing对被单元测试的对象 然而将secondMethod()分成另一个类是没有意义的.我的方法与这个类有关.创建一个不同的测试类对我来说似乎不对.即使使用spy()模拟实际类也不是最正确的方法,正如帖子中已经解释过的那样.
我不认为我应该创建一个Activity类的模拟,因为那是我正在测试的类.我非常感谢对此的帮助和见解.
Mur*_*nik 30
如您所述,act不是模拟,因此您无法在其上记录行为.您可以使用Mockito.spy,以及间谍(或部分模拟)act对象,以便您只记录secondMethod和执行实际代码的行为firstMethod.
但是请注意,这匹配器不能使用doReturn你如何调用regardles 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();
}
}
Run Code Online (Sandbox Code Playgroud)
稍微优雅的语法允许您使用注释而不是显式调用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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37194 次 |
| 最近记录: |