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



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

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

这是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;
    }
}

我不想在我的应用程序中访问数据库,我只想像Mockito在JUnit中那样在我的java应用程序中模拟A的方法,但我无法使它在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"(如问题评论中所述),则可以使用字节码插入库,如ByteBuddy、Javassist或CGLIB。这些库允许您在运行时重写方法的字节码,通常用于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");

在单元测试中,您可以用自己的IDataAcess替换dataAcess。

application.setDataAcess(new MyTestDataAcess());

其中MyTestDataAcess在单元测试文件夹中实现。

您不需要任何特殊的lib,只需要纯java即可。

相关内容

  • 没有找到相关文章

最新更新