间谍对象值不随时间更改,然后返回


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

您是在 objobj.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(在我的例子中,在类到测试上),但我从不那样做。

相关内容

最新更新