在java中测试如何检查接口的方法是否被调用?

时间:2014-06-02 11:39:57

标签: java unit-testing junit mocking jmockit

我想测试这个使用匿名类调用接口方法的类。

public class ClassToTest 
{
    public void methodToTest()
    {
        InterefaceToMock interefaceToMockReference = new InterefaceToMock() {

            @Override
            public int methodToMock()
            {
                return 0;
            }
        };
        interefaceToMockReference.methodToMock();
    }
}

这是界面

public interface InterefaceToMock 
{
    public int methodToMock();
}

我正在使用这个approch来检查它是否调用了methodToMock

import static org.junit.Assert.*;

import org.junit.Test;

import mockit.FullVerificationsInOrder;
import mockit.Mocked;
import mockit.NonStrictExpectations;
public class TestAClass 
{
    @Mocked InterefaceToMock interefaceToMockReferenceMocked;
    @Test
    public void test1()
    {
        new NonStrictExpectations()
        {
            {
                interefaceToMockReferenceMocked.methodToMock();times=1;
            }
        };
        (new ClassToTest()).methodToTest();
        new FullVerificationsInOrder(interefaceToMockReferenceMocked)
        {
        };
        assertTrue(true);
    }
}

但是测试用例失败了。 任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:1)

您的原始测试几乎是正确的。它声明模拟字段只是@Mocked,它只是给你一个实现接口的模拟实例,而这不是被测代码所使用的实例。但是,JMockit API具有另一个模拟注释,它将模拟扩展到给定基类型的所有实现类,并且默认情况下会影响所述类的所有实例。因此,测试应更改如下:

public class TestAClass 
{
    @Capturing InterfaceToMock anyImplementingInstance;

    @Test
    public void test1()
    {
        new ClassToTest().methodToTest();

        new Verifications() {{
            anyImplementingInstance.methodToMock();
        }};
    }
}

答案 1 :(得分:0)

在一般情况下,如果您有class,并且想要检查是否调用Mock的{​​{1}}上的方法,则使用class

例如:

Mockito.verify

此处,测试是public class AppTest { @Test public void testMe() { final ITest iTest = Mockito.mock(ITest.class); final CUT cut = new CUT(iTest); cut.doStuff(); Mockito.verify(iTest).someStuff(); } interface ITest { void someStuff(); } class CUT { private final ITest iTest; CUT(ITest iTest) { this.iTest = iTest; } public void doStuff() { iTest.someStuff(); } } } 是否调用ITest.someStuff()

你的例子是难以理解的......