是否可以将我的mock的依赖项注入属于不同包的类中?

时间:2015-03-18 20:15:14

标签: java dependency-injection

我的问题在这里有点广泛,所以即使是想法或方法也足够好。我想要做的是,我试图通过创建一个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();
}

2 个答案:

答案 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类并定义您希望它显示的行为。