public class MainClass {
public void method1() {
…….
String str = getMethod2();
method3(str);
}
protected String getMethod2() {
String str = “Actual Value”
return str;
}
private void method3(String strparam) {
……
}
}
@RunWith(MockitoJunitRunner.class)
public class Testclass {
@InjectMocks
MainClass obj = new MainClass();
……
@Test
public void testSpy() {
MainClass spyMain = spy(obj);
when(spyMain.getMethod2()).thenReturn(new String("Testing spy"));
obj.method1();
……..
}
}
要使用从test的getMethod2()返回的新值,因为它将被传递给method3。 我的印象是测试类对method1的调用调用了method2,我认为从method2重调的值是“ Testing spy”,但是“ Actual Value”,并且在运行测试类时,“ Actual Value”会传递给method3。 如何使用测试类中的新值?
答案 0 :(得分:1)
您正在obj
(obj.method1();
)上调用该方法,而不是在您所监视的对象spyMain.method1();
上调用该方法。
答案 1 :(得分:0)
假设示例中的代码实际上是Java代码,并且在将其复制到Microsoft Word(或其他某种文字处理器)中时添加了大写字母, 试试这个:
public void testSpy()
{
MainClass spyMain = spy(obj);
doReturn("Blammy").when(spyMain).getMethod2();
obj.method1();
}
以下是更多信息:
doReturn
的模拟变体不会调用包装方法,
但是thenReturn
变体确实可以。@InjectMocks
MainClass obj = new MainClass();
@InjectMocks
,请仅使用MockitoAnnotations.initMocks(class)
注释。这是您的测试班级,改写为使用@InjectMocks
@RunWith(MockitoJunitRunner.class)
public class Testclass
{
@InjectMocks
private MainClass classToTest;
@Before
public void beforeTest()
{
MockitoAnnotations.initMocks(this)
}
@Test
public void testSpy()
{
spyClassToTest = spy(classToTest);
doReturn("Testing spy").when(spyClassToTest ).getMethod2();
spyClassToTest.method1();
}
}
更多说明:
您可能可以在同一对象上使用@Spy
和@InjectMocks
(在我的示例中,在classToTest上),
但我从不这样做。