我有MyClass,我正在为每个方法(Method1Test)做一个测试类
public class MyClass {
public int method1(){
int a = method2();
return a;
}
public int method2(){
return 0;
}
}
@RunWith(MockitoJUnitRunner.class)
public class Method1Test {
@InjectMocks
private MyClass myClass = new MyClass();
@Before
public void setup(){}
@Test
public void test01(){
Mockito.when(myClass.method2()).thenReturn(25);
int a = myClass.method1();
assertTrue("We did it!!!",a==25);
}
}
问题是,我无法模拟对方法2的调用,使其返回不同的值。莫基托的句子不起作用。
非常感谢^_^
您必须在测试中的类上创建一个spy,并通过重新定义spy 的method2()
的行为来部分模拟它
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
public class Method1Test {
private MyClass myClass = new MyClass();
@Test
public void test01(){
//given
MyClass spy = spy(myClass); //create a spy for class-under-test
when(spy.method2()).thenReturn(25); //partially override behavior of the spy
//when
int a = spy.method1(); //make the call to method1 of the _spy_!
//then
assertEquals(25, a);
}
}
除此之外,您的测试既不需要Mockito Runner也不需要@InjectMocks
,因为您没有将@Mock
注释的mock注入到测试中的类中。
此外,只有当断言条件为NOT时,才会显示assertTrue
语句中的消息。所以它应该是至少"我们失败了!!";)
最终,我找到了一个横向解决方案,而没有创建新的类(我一直无法做到这一点,因为它在实际项目中被禁止)。我把测试中的方法改写了。
解决方案是
public class MyClass {
public int method1(){
int a=0;
a=method2();
return a;
}
public int method2(){
return 1;
}
}
@RunWith(MockitoJUnitRunner.class)
public class Method1Test {
@InjectMocks
private MyClass myClass = new MyClass(){
public int method2(){
return 25;
}
};
@Before
public void setup(){}
@Test
public void test001(){
Mockito.when(myClass.method2()).thenReturn(25);
int a = myClass.method1();
assertTrue("We did it!!!",a==25);
}
}
我使用下面的代码尝试了解决方案,但没有通过。
Mockito.when(myClass.method2()).thenReturn(25);
之后,我尝试了一些不同的东西,并成功地通过了测试,而不是上面的代码片段。看看:
Mockito.doReturn(25).when(myClass).method2();
为了模拟测试(它可能是一个内部方法),您必须使用doReturn()方法。
对于任何方法,您都可以使用doThrow()、doAnswer()、doNothing()、do Return()和doCallRealMethod()来代替带有when()的相应调用。当你
- 短柱空心法
- 间谍对象上的存根方法(见下文)
- 多次存根相同的方法,以便在测试过程中更改mock的行为
但你可能更喜欢用这些方法来代替其他方法使用when(),用于所有的存根调用。
更多信息可在此处阅读https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#12
我们需要使用Mockito.spy()来模拟我们正在测试的同一个类,而不是在这里使用mock(class)。然后我们可以如下模拟我们想要的方法。
@Test
public void method1Test() {
MyClass myClass = new MyClass();
MyClass myClass1 = Mockito.spy(myClass);
Mockito.doReturn(1).when(myClass1).method2();
Assert.assertEquals(1, myClass1.method1());
}
}