我有类似于以下结构的方法。
method1(Object obj,byte[] myarray)
{
mymanager.dbcall1();
mymanager2.dbcall2();
}
现在我想编写 JUNIT 测试用例,它实际上可以模拟这些正在执行 dbcalls 的管理器?最后我想比较结果。这些管理器仅在应用程序运行时可用。
你想测试method1()
吗?如果是这样,我假设您mymanager
在封闭类中有一个 setter,这将使您能够(使用 Mockito):
@Before
public void setUp()
{
MyClass my = new MyClass();
MyManager mgr = mock( MyManager.class );
my.setManager( mgr );
// Similar for mymanager2
}
然后所有的方法调用mgr
都将返回 null。如果您需要其他返回值,doReturn(...).when( mgr ).dbcall1()
可以使用该构造。
干杯,
首先,您需要一些依赖注入。有很多方法可以做到这一点,但这里有一个简单的方法:
private I_DatabaseManager mymanager = null;
method1(Object obj,byte[] myarray)
{
getDatabaseManager().dbcall1();
getDatabaseManager().dbcall2();
}
private I_DatabaseManager getDatabaseManager() {
if (mymanager == null) {
return getProductionImplementationOfDatabaseManager();
}
return mymanager;
}
protected void setDatabaseManagerImplementation(I_DatabaseManager newImplementation) {
mymanager = newImplementation;
}
然后,在您的测试代码中,您可以创建一个实现 I_DatabaseManager 接口的模拟类,并在您的测试中设置这个模拟实现。