如何在正在测试相同 class 的另一个方法中模拟正在调用的 class 方法?
How to mock a method of a class being called inside another method that is being tested of the same class?
例如,有一个 class A 具有两个方法 methodUnderTest() 和 display(),其中 methodUnderTest 调用显示方法。在使用 mockito 编写 junit 时,如何模拟 display() 方法?
class A{
public int method methodUnderTest{
//some code
display();
}
public int display(){
//some code
}
}
你不需要 mockito。在测试中创建测试对象时,您可以通过
创建它
A underTest = new A() {
@Override
public int display() {
return <expected result>
}
}
这样就可以控制display方法返回什么样的值了
如果你想使用 mockito,我会选择类似的东西:
@Mock
private A a;
@Test
public void test() {
//define the behaviour
Mockito.when(a.display()).thenReturn(12);
// call methodUnderTest
int res = a.methodUnderTest();
// check that you get what you want
Assert.assertEquals(SOME_VALUE, res);
}
如果您不想使用注释,您可以像这样初始化 a
:
A a = Mockito.spy(new A());
HTH!
如果这是你的 class:
public static class A{
public int methodUnderTest() {
return display();
}
public int display(){
return 1;
}
}
然后使用 mockito,你可以这样做:
A a = spy(new A());
when(a.display()).thenReturn(0);
System.out.println(a.methodUnderTest()); // will print 0
解释:
当您 mock()
一个 class 时,没有底层实例,您调用的所有方法将不执行任何操作并且 return 默认值,除非另有说明。
当您 spy()
在一个实例上时,所有调用都会被记录下来,并 转发到实际实例 。这意味着您的 class 行为将保持完全相同,除非您模拟特定调用。
话虽如此,像您这样的情况通常是您需要拆分 class 并在 separating your concerns.
上投资一点的症状
例如,有一个 class A 具有两个方法 methodUnderTest() 和 display(),其中 methodUnderTest 调用显示方法。在使用 mockito 编写 junit 时,如何模拟 display() 方法?
class A{
public int method methodUnderTest{
//some code
display();
}
public int display(){
//some code
}
}
你不需要 mockito。在测试中创建测试对象时,您可以通过
创建它A underTest = new A() {
@Override
public int display() {
return <expected result>
}
}
这样就可以控制display方法返回什么样的值了
如果你想使用 mockito,我会选择类似的东西:
@Mock
private A a;
@Test
public void test() {
//define the behaviour
Mockito.when(a.display()).thenReturn(12);
// call methodUnderTest
int res = a.methodUnderTest();
// check that you get what you want
Assert.assertEquals(SOME_VALUE, res);
}
如果您不想使用注释,您可以像这样初始化 a
:
A a = Mockito.spy(new A());
HTH!
如果这是你的 class:
public static class A{
public int methodUnderTest() {
return display();
}
public int display(){
return 1;
}
}
然后使用 mockito,你可以这样做:
A a = spy(new A());
when(a.display()).thenReturn(0);
System.out.println(a.methodUnderTest()); // will print 0
解释:
当您 mock()
一个 class 时,没有底层实例,您调用的所有方法将不执行任何操作并且 return 默认值,除非另有说明。
当您 spy()
在一个实例上时,所有调用都会被记录下来,并 转发到实际实例 。这意味着您的 class 行为将保持完全相同,除非您模拟特定调用。
话虽如此,像您这样的情况通常是您需要拆分 class 并在 separating your concerns.
上投资一点的症状