java应用程序是否有类似Mockito的框架(不在JUnit/测试环境下)?

java应用程序是否有类似Mockito的框架(不在JUnit/测试环境下)?,java,junit,mockito,Java,Junit,Mockito,我正在写一个工具(不用于测试目的),它基于一些我无法触及的现有代码(这里是a类模块B),我想模仿他们的行为 我试图为我的java应用程序找到类似Mockito的东西,但不是在JUnit/测试环境下,或者找到一个可以使Mockito在JUnit/测试环境下工作的解决方案 这里是A级: public final class A{ // I can't touch this class, and I can't touch module B where A is called public

我正在写一个工具(不用于测试目的),它基于一些我无法触及的现有代码(这里是a类模块B),我想模仿他们的行为

我试图为我的java应用程序找到类似Mockito的东西,但不是在JUnit/测试环境下,或者找到一个可以使Mockito在JUnit/测试环境下工作的解决方案

这里是A级:

public final class A{  // I can't touch this class, and I can't touch module B where A is called
    public static String getType(String name){
        ... // DataBase access
    }
}
这是我的申请表:

public class myApp{
    public Object compute(String name){
        // execute module B's code, where A is widely called
        return computedObject;
    }
}
我不想在我的应用程序中访问数据库,我只想在我的java应用程序中模拟A的方法,就像在JUnit中模拟Mockito一样,但我无法使它在JUnit中工作,也无法为java应用程序找到类似的框架

如果我使用Mockito,那么我将

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)  // does this mean Mockito only works under Testing environment?
public class myApp{ 
    @Test
    public Object compute(String name){
        // mock A           
        // call code in module B
        return computedObject;
    }
}
但是我不能调用一个测试方法并从我的java应用程序(不是JUnit)获取它的返回值,JUnitCore只能执行所有测试,不能返回某些测试方法的值

我需要做与Mockito完全相同的事情,但不是在测试中 环境,我不能修改类A,也不能修改模块B,在 未来我可能需要模拟对象/模拟静态的创建 方法。。。(与Mockito的功能相同),但我不想重写 由于Mockito for java应用程序的成本太高,因此 使用JUnit开发类似的框架将非常好

有人能告诉我一些想法吗

编辑:
我认为我的用例非常常见,这样的框架在某些情况下会非常有用

为什么没有这样的框架,是我遗漏了什么还是我犯了一些错误?

如果不能修改您的“模块B”(如您问题的评论中所述),您可以使用字节码插入库,如,或。这些库允许您在运行时重写方法的字节码,通常用于java代理

(顺便说一句,Mockito正是这样做的。它使用ByteBuddy为您的类提供工具)

如果您编写该工具

“我正在编写一个依赖于模块B的工具”

然后,您可以使用接口删除对B的依赖关系:

public interface IData {
  String getType(String a)
}
在B内:

public class BDataAcess implements IData {
    public String getData(String a) {
       return A.getType();
    }
}
并以这种方式在生产代码中使用它

IDataAcess dataAcess = new BDataAcess();
dataAcess.getData("money");
在单元测试中,您用自己的IDataAccess替换DataAccess

application.setDataAcess(new MyTestDataAcess());
其中MyTestDataAccess在单元测试文件夹中实现


您不需要任何特殊的库,只需要纯java。

也许AspectJ可以帮助您实现这一点,或者在该类后面实现代理模式为什么不实现一个接口,或者使用组合呢?甚至实现一个
服务提供商
?我不明白。你为什么不使用Mockito本身呢?它不需要JUnit。如果你想在你的程序中用它来模拟一个对象,那么就这样做。@fge,因为我不能接触类A,它已经存在了。@Guillaume F,因为我在尝试使用Mockito而不是JUnit时遇到了一些问题,加上Mockito是一个JUnit框架,它让我认为它只能与JUnit一起工作,我会重试。谢谢你的回答,我所拥有的pb是我不能触摸A类,也不能触摸A被调用的模块B。如果你不能触摸B,那么测试B就不是你的工作。可测试性设计必须在开发src时完成,而不是之后。我不想重写像Mockito这样的框架,因为我可能需要模拟静态方法/模拟普通方法/模拟构造函数。。。。在未来,解决我的pb会太复杂,有没有现有的框架在Mockito下做同样的事情,但不在测试环境下?