使用Mockito来验证来自另一个类的方法

时间:2017-06-12 22:40:05

标签: junit mockito

我遇到了PIT突变问题,如果它删除了class.callVoidMethod(),它就会存活下来。我假设我只需要验证呼叫已经完成,但我无法让测试用例变为绿色。我已经尝试过Spying和Mocking但是我得到的是与这个模拟没有任何交互。在调试时,我看到的仍然是调用真正的方法。知道如何让它使用模拟吗?

测试方法:

public void someMethod(String word)  
{
    word = "class"
    SomeClass class = new SomeClass();  
    class.callVoidMethod(word, "char");  
}

测试用例:

@InjectMocks
ClassUnderTest underTest;   
@Mock
SomeClass class;

@Test
public void testSomeMethod()
{
    underTest = new ClassUnderTest();
    //Not Sure if I need this
    Mockito.doCallRealMethod()
        .when(class).callSomeVoidMethod(anyString());
    underTest.someMethod("test");
    Mockito.verify(class).callSomeVoidMethod(anyString());
}

1 个答案:

答案 0 :(得分:1)

这是我在本地运行的一个例子。除了一些命名问题,主要问题是你实际上并没有嘲笑SomeClass。您正在测试的方法是创建并调用实例。此外,在使用跑步者时,您无需创建测试主题的实例。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class VerifyTest {

    @InjectMocks
    private ClassUnderTest underTest;

    @Mock
    private SomeClass clazz;

    @Test
    public void testSomeMethod() {
        underTest.someMethod("test");
        Mockito.verify(clazz).callVoidMethod("test", "char");
    }

    private static class ClassUnderTest {

        private SomeClass clazz;

        public void someMethod(String word) {
            clazz.callVoidMethod(word, "char");
        }
    }

    private static class SomeClass {
        public void callVoidMethod(String word, String otherWord) {
            // do nothing
        }
    }
}