我正在基于一些我无法触及的现有代码(这里是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即可。