间谍对象的值不随时间变化,然后返回

时间:2018-12-21 16:09:00

标签: java mockito

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。 如何使用测试类中的新值?

2 个答案:

答案 0 :(得分:1)

您正在objobj.method1();)上调用该方法,而不是在您所监视的对象spyMain.method1();上调用该方法。

答案 1 :(得分:0)

假设示例中的代码实际上是Java代码,并且在将其复制到Microsoft Word(或其他某种文字处理器)中时添加了大写字母, 试试这个:

public void testSpy()
{
    MainClass spyMain = spy(obj);
    doReturn("Blammy").when(spyMain).getMethod2();

    obj.method1(); 
}

以下是更多信息:

  • 测试类必须与MainClass位于同一包中。 例如:
    MainClass的位置:src / main / java / blammy / MainClass.java
    TestClass的位置:src / test / java / blammy / TestClass.java
  • 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上), 但我从不这样做。