Man*_*dre 2 java mocking mockito spy
我遇到了mockito.spy方法的问题.
我最近到了一个"旧"项目,我的第一个任务是在其中添加mockito,并进行真正的单元测试:)
该项目存在许多概念问题,但这不是重点;)
我解释一下我的问题:
我上课了
public class Tutu{
public Tutu(){
}
}
public class Toto{
public Toto(){
}
public int executeToto(Tutu tutu){
//do some stuff
return 5;
}
}
public class Titi{
private Toto toto;
public Titi(){
this.toto = new Toto();
}
public void executeTiti(){
//do some stuff
Tutu tutu = new Tutu();
int ret = this.toto.executeToto(tutu);
//do some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试类TitiTest.java中我想只测试executeTiti,我不想测试executeToto的东西,因为这个类有自己的测试类TotoTest.java.
但正如你所看到的,toto是在titi构造函数中实例化的,所以我尝试这样的事情:(我也在我的测试中使用PowerMock,所以我使用的是PowerMockRunner,但它似乎不是问题)
@RunWith(PowerMockRunner.class)
public class TitiTest {
@Test
public void testExecuteTiti(){
Toto toto = Mockito.spy(new Toto());
Mockito.doReturn(2).when(toto).executeToto(Mockito.any(Tutu.class));
Titi testedObject = new Titi();
testedObject.executeTiti();
}
}
Run Code Online (Sandbox Code Playgroud)
但真正的方法是每次调用和ret = 5 :(
我错过了什么吗?我在stackoverflow上阅读了很多关于这个的帖子并尝试了所有解决方案,但它永远不会工作,因为我认为我做对了.
我使用junit4.11/powermock1.5.4/mockito1.9.5
Jef*_*ica 10
Toto toto = Mockito.spy(new Toto());
Run Code Online (Sandbox Code Playgroud)
请记住,您在此行中创建的Toto实例上的间谍/存根,而不是每个新创建的Toto.所以当你打电话时:
Titi testedObject = new Titi();
testedObject.executeTiti();
Run Code Online (Sandbox Code Playgroud)
构造函数new Titi()本身创建了一个不受Mockito影响的Toto新实例,因此调用this.toto.executeAction()将始终返回5.
因为您正在使用PowerMockito运行,所以您可以选择对Toto的构造函数进行存根:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Titi.class) // stub the calling class Titi, not Toto!
public class TitiTest {
@Test public void testExecuteTiti() {
Toto toto = Mockito.spy(new Toto());
Mockito.doReturn(2).when(toto).executeToto(Mockito.any(Tutu.class));
PowerMockito.whenNew(Toto.class).withAnyArguments().thenReturn(toto);
Titi testedObject = new Titi();
testedObject.executeTiti();
}
}
Run Code Online (Sandbox Code Playgroud)
但我最喜欢的选项是为Titi创建一个辅助构造函数,用于测试:
public Titi(){
this.toto = new Toto();
}
/** For testing only. Uses the passed Toto instance instead of a new one. */
Titi(Toto toto){
this.toto = toto;
}
Run Code Online (Sandbox Code Playgroud)
然后只需要你像这样调整你的测试:
@Test public void testExecuteTiti(){
Toto toto = Mockito.spy(new Toto());
Mockito.doReturn(2).when(toto).executeToto(Mockito.any(Tutu.class));
Titi testedObject = new Titi(toto);
testedObject.executeTiti();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15005 次 |
| 最近记录: |