我的问题在这里有点广泛,所以即使是想法或方法也足够好。我想要做的是,我试图通过创建一个java Connection对象来编写一个类的测试,该类通过堆栈进行数据库调用。所以我想在这里模拟/注入我自己的连接但是棘手的部分是这种情况发生在调用堆栈下面,它实际上将我带到一个不同的包(我的项目所依赖的)。这是调用堆栈的框架。
Package A
Class One
getLatestChanges()
calls
Package B
Class Two
getChanges()
calls
Package B
Class Three
getChanges()
calls
Package C
Class Four
getConnection() <= returns the Connection
我想知道我是否可以使用Guice或其他东西以某种方式欺骗Class Four的方法getConnection()来返回不同的连接(我正在使用H2创建一个内存数据库,仅用于测试)。问题是,所有类的设计都使得它们不接受依赖,而只是在其中创建状态。
getConnection()是一个私有方法:
private Connection getConnection() {
return ConnectionFactory.getFactory().create().getConnection();
}
答案 0 :(得分:1)
简单但令人失望的答案:
你不能注入任何你不能简单地填充&#34;手动&#34;否则。
我的观点是,你的问题并非真的要不要只是在他们准备好/需要的时候初始化/注入一些东西而烦恼(这是他们的目的)注入),只需要简单地替换你的一个组件的某些部分。
另外,如果你还没有使用任何依赖注入,我相信只为测试引入这样的框架感觉......&#34; meh&#34;。不要误解我的意思,我并不是说测试并不重要:就是这样,你是否需要 CDI,我对你很有信心&#39 ; d也适合你的实际项目。
所以也许你不需要它。
实际上,也许你只需要在One
包中测试你的班级A
(并在其他地方测试其余的,或者假设其余的工作正常(例如:& #34;休息&#34;将是第三方图书馆。)
在这种情况下,您是否可以简单地模拟B.Two#getChanges()
,以便它响应您控制的一些虚拟数据?
这样,您就可以真正专注于测试A.One#getLatestChanges()
执行B.Two#getChanges()
所做的事情,而不管其他所有内容。
答案 1 :(得分:0)
您需要稍微更改其中一个类以使其可测试,您可以根据自己的需要进行操作。如果您真的想测试D类,我建议在D类中添加一个setter以使连接可注入,并使用PowerMock或自己创建一个MockConnection类并定义您希望它显示的行为。