我已经开始读“行动中的春天”了。
我对JUnit一无所知,我认为我对此表示怀疑。
有一个代码片段,作者在其中引用并表示很难测试:
package com.springinaction.knights;
public classDamselRescuingKnight implements Knight {
private RescueDamselQuest quest;
public DamselRescuingKnight() {
quest = new RescueDamselQuest();
}
public voidembarkOnQuest() throwsQuestException {
quest.embark();
}
}提交人说:
为DamselRescuingKnight编写单元测试将非常困难。在这样的测试中,您希望能够断言在调用骑士的embarkOnQuest()时调用了quest的assert ()方法。但这里没有明确的方法来实现这一点。不幸的是,DamselRescuingKnight仍未经过测试。
作者这么说是什么意思?
为什么代码在这里很难测试?
发布于 2013-03-13 13:44:58
我最初的想法是,它很难测试,因为"RescureDamselQuest“对象是在构造函数中初始化的。例如,这使得插入模拟对象变得困难。一个模拟对象将帮助您测试在"RescueDamselQuest“对象上是否调用了would ()方法。
解决这个问题的一个更好的方法可以是在构造函数中包含一个参数(通常我更喜欢这种方法):
public DamselRescuingKnight(RescueDamselQuest quest){
this.quest = quest;
}或者添加一个策划人:
public void setDamselRescuingKnight(RescueDamselQuest quest){
this.quest = quest;
}发布于 2013-03-13 14:00:06
我给出的一个常见示例是,您希望打开一个文件,解析它,并得到一个数据类。大多数人会做这样的事情:
Data openAndParse(String filename) {
...openFile
...parse
}通过这样做,文件打开方法和解析是高度耦合和难以测试的。如果您在打开和解析方面有问题,那么它是用于解析还是打开?
为了简单起见,为了简单起见,通过编写JUnit测试,您不得不做类似于.
BufferedReader openFile(String filename) {
...open file and return reader
}
Data parse(BufferedReader input) {
...parse and return data
}JUnit引导我们找到一个更有凝聚力的解决方案。我们只需创建一个字符串,构造一个JUnit,然后是一个BufferedReader,就可以编写BufferedReader测试。你猜怎么着?非常类似的是,我们现在可以使用解析来接受来自各种来源的输入,而不仅仅是文件。
发布于 2013-03-13 13:45:46
很难进行测试,因为任务实现不能被替换掉。如果没有字节代码的修改,就没有一种简单的方法可以查看上船是否被调用。
如果可以在构造函数或setter中设置任务实现,则可以传递一个实现,该实现可以监视要启动的调用。
https://stackoverflow.com/questions/15387010
复制相似问题