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

标签 java unit-testing junit mocking jmockit

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

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

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

这是界面

public interface InterefaceToMock 
{
    public int methodToMock();
}

我正在使用这个方法来检查是否调用了 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);
    }
}

但是测试用例失败了。 谁能帮忙。

最佳答案

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

public class TestAClass 
{
    @Capturing InterfaceToMock anyImplementingInstance;

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

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

关于java - 在java中测试如何检查接口(interface)的方法是否被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23993645/

相关文章:

java - Hibernate:session.load 与 session.get

java - 关于FTL的SimpleScalar

java - JUnit - 分享不同实现的测试

java - 线程间通信程序

java - 使用 Javascript 在提交时更改字段的值

unit-testing - 声明在 Controller 中设置的 session 变量-Grails测试用例

c++ - 在函数/类声明附近编写 C++ 单元测试

angularjs - Protractor 不从自动完成搜索地址中选择第一个元素

java - Eclipse junit View 中的不可打印字符

java - 安卓测试套件 : Include all TestCases except some explicitly defined