如何在java中模拟类而不创建接口
首先,我不是Java开发人员,我使用的是php 我对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
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所做的事情。(构建您自己的模拟框架,例如使用代理)构建您自己的模拟框架不是本机方式