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();
……..
}
}
想要使用从测试中从getMethod2()返回的新值,因为它将被传递给method3。我的印象是测试类对方法1的调用调用方法2,我认为从方法2重新调整的值是"测试间谍",但是"实际值",并且"实际值"在测试类运行时传递给方法3。如何使用测试类中的新值?
您是在 obj
( obj.method1();
) 上调用该方法,而不是在你监视的对象上调用该方法:spyMain.method1();
。
假设示例中的代码实际上是 java 代码,并且在将其复制到 Word(或其他文字处理器)Microsoft时添加了大写,试试这个:
public void testSpy()
{
MainClass spyMain = spy(obj);
doReturn("Blammy").when(spyMain).getMethod2();
obj.method1();
}
以下是更多信息:
- 测试类必须与主类位于同一包中。例如:
MainClass的位置:src/main/java/blammy/MainClass.java
TestClass的位置:src/test/java/blammy/TestClass.java - 模拟的
doReturn
变体不调用包装方法,但thenReturn
变化确实如此。 - 这是错误的:
@InjectMocks
MainClass obj = new MainClass();
仅当您调用MockitoAnnotations.initMocks(class)
时才使用@InjectMocks
注释。
这是重写的测试类以使用@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
(在我的例子中,在类到测试上),但我从不那样做。