无注射测试

时间:2015-09-15 20:34:50

标签: testing junit mocking code-injection

我所读到的关于模拟,存根(测试双打)的大部分内容都涉及通过SUT方法本身或构造函数或setter方法注入DOC的某种形式。像InjectMock那样注入违反边界的注释作为常规测试策略是不受欢迎的。但是,如果您正在构建一个您不想公开这些DOC的课程呢?有没有办法让单位'测试这样的模块?没有AOP?这样的测试不是一个真实的单元吗?再试一次?我能感受到设计气味的阻力吗?我应该以某种方式揭露这些DOC?

例如,假设我有以下要测试的类(单位或其他):

public class RemoteRepository {
  Properties props = null;
  public RemoteRepository(Properties props) { this.props=props; }
  public Item export (String itemName) {
    JSch ssh = new JSch();
    ssh.setIdentity(props.get("keyfile"));
    ssh.connect();
    ssh.execute("export "+itemName+" "+props.get("exportFilename"));
    ...
}

这是一个我想编写单元测试的单元,但我想要存根或模拟出JSch组件。但是我在方法中创建的用于执行方法需要完成的事情的对象甚至不会暴露在方法之外。所以我不能注入一个存根来替换它们。我可以更改导出方法签名以接受存根,或添加一个构造函数,但这会改变我的设计以适应测试。

虽然设备将连接到真实服务器以便在prod中进行导出,但在测试设备时,我要么完全将DOC存根,要么使用简单且受控的真实DOC进行模拟。

后一种方法就像使用内存db而不是真正的db,因为它的行为和行为类似于将要使用的最终db,但可以仅限于测试所需的内容(例如,仅仅是感兴趣的表,没有沉重的安全性等)。所以我可以在我的测试中设置某种测试双sshd,这样当构建运行测试时,它有一些可以测试的东西。然而,这可能会给设置和维护带来很多麻烦,并且看起来有点过分 - 有时候试图找出真正的DOC比仅仅使用真实的DOC更难。

我是不是试图设置一个提供sshd测试的测试框架?我是以错误的方式看待这个吗?我是否只使用打破类范围边界的AOP或模拟库方法?

重申一个基本问题是很多次我想测试一个具有复杂DOC的方法(即那些与其他系统交互的方法:网络,数据库等)并且我不想改变该设计仅适用于测试双DOC注入。在这种情况下,您如何进行测试?

1 个答案:

答案 0 :(得分:1)

根据个人经验,我的建议是编写集成测试,其中DOC(依赖于组件)模拟。

但是,如果由于某种原因团队坚持进行单元测试,则必须使用合适的模拟工具(AOP工具能够,但不适合这里),或者改变SUT和DOC的设计,以便使用"更弱"嘲弄工具。