Java代码测试中的澄清

Dar*_*ter 3 java spring

我已经开始阅读Spring in Action一书了.

我不知道JUnit,我认为我的疑问是关于.

作者提到了一个代码片段,并说它很难测试:

package com.springinaction.knights;

public classDamselRescuingKnight implements Knight {

    private RescueDamselQuest quest;

    public DamselRescuingKnight() {
       quest = new RescueDamselQuest();
    }

    public voidembarkOnQuest() throwsQuestException {
       quest.embark();
    }
}
Run Code Online (Sandbox Code Playgroud)

作者说:

为DamselRescuingKnight编写单元测试非常困难.在这样的测试中,你希望能够断言在调用骑士的embarkOnQuest()时调用任务的embark()方法.但是在这里没有明确的方法来实现这一目标.不幸的是,DamselRescuingKnight仍未经过测试.

作者的意思是什么?

为什么这里的代码难以测试?

Jar*_*sen 8

我最初的想法是很难测试,因为"RescureDamselQuest"对象在构造函数中初始化.这使得例如插入模拟对象变得困难.模拟对象可以帮助您测试在"RescueDamselQuest"对象上调用embark()方法.

解决这个问题的更好方法是在构造函数中包含一个参数(通常我更喜欢这个方法):

public DamselRescuingKnight(RescueDamselQuest quest){
   this.quest = quest;
}
Run Code Online (Sandbox Code Playgroud)

或者添加一个setter:

public void setDamselRescuingKnight(RescueDamselQuest quest){
   this.quest = quest;
}
Run Code Online (Sandbox Code Playgroud)