Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中模拟类而不创建接口_Java_Testing_Mocking - Fatal编程技术网

如何在java中模拟类而不创建接口

如何在java中模拟类而不创建接口,java,testing,mocking,Java,Testing,Mocking,首先,我不是Java开发人员,我使用的是php 我对Java很好奇,例如,如果我有这样的结构: interface Ainterface { public String method(); } public class A implements Ainterface { public String method() { //do something } } public class B { public String method(Ainterf

首先,我不是Java开发人员,我使用的是php

我对Java很好奇,例如,如果我有这样的结构:

interface Ainterface {
    public String method();
}

public class A implements Ainterface {
    public String method() {
       //do something
    }
}

public class B {
    public String method(Ainterface a) {
       a.method();
       //do something
    }
}
public class A {
    public String method() {
       //do something
    }
}

public class B {
    public String method(A a) {
       a.method();
       //do something
    }
}
现在,如果我想测试
B
的方法,我可以模拟
a

public class Amock implements Ainterface {
    public String method() {
       //do something
    }
}
并将其注入
B
的方法中

但是,如果我不想创建接口,我遇到这样的情况:

interface Ainterface {
    public String method();
}

public class A implements Ainterface {
    public String method() {
       //do something
    }
}

public class B {
    public String method(Ainterface a) {
       a.method();
       //do something
    }
}
public class A {
    public String method() {
       //do something
    }
}

public class B {
    public String method(A a) {
       a.method();
       //do something
    }
}

有什么方法可以模拟
a
或以其他方式测试
B
的方法吗?

在Java中,您可以使用特定的模拟框架,例如,并使用它的特定方法

A aMock = Mockito.mock(A.class);
当然,通过这种方式,您只能创建一个真正简单的mock,它实际上什么也不做,但是框架允许您定义在提供
when/then
机制时应该返回什么特定方法。这样的例子可以是

when(aMock.method()).thenReturn("I am just a fake");
mockito非常强大,我无法在这个答案中解释整个框架,所以请访问mockito主页了解这一点


Mockito也是一种解决方案——它很受欢迎,但不仅仅是这样,你可以寻找最符合你需求的解决方案。antkowicz的答案通过使用mocking框架展示了正确的方法。在你的评论中,你要求一种不使用外部框架的方法,所以这个答案试图解决这个问题

就像通过实现
Ainterface
创建
Amock
一样,您可以创建扩展
a
的子类

因此,您将有一个类,如
类AmockClassBased扩展了一个
,然后您可以重写
方法()
,使其执行您在
Amock
类的
方法()中执行的操作

因此,您的
Amock
将更改为:-

public class AmockClassBased extends A {

    @Override
    public String method() {
       //do something
    }
}

然后你可以把这个类的一个实例传递给
B
方法(A)

谢谢你的回答,我明白了,但是如果我不想使用框架,有没有什么原生的方法呢?是的,但那将是重新发明轮子,生成代码来做类似于mockito所做的事情。(构建您自己的模拟框架,例如使用代理)构建您自己的模拟框架不是本机方式