首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java代码测试中的澄清

Java代码测试中的澄清
EN

Stack Overflow用户
提问于 2013-03-13 13:41:00
回答 4查看 164关注 0票数 3

我已经开始读“行动中的春天”了。

我对JUnit一无所知,我认为我对此表示怀疑。

有一个代码片段,作者在其中引用并表示很难测试:

代码语言:javascript
复制
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仍未经过测试。

作者这么说是什么意思?

为什么代码在这里很难测试?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-13 13:44:58

我最初的想法是,它很难测试,因为"RescureDamselQuest“对象是在构造函数中初始化的。例如,这使得插入模拟对象变得困难。一个模拟对象将帮助您测试在"RescueDamselQuest“对象上是否调用了would ()方法。

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

代码语言:javascript
复制
public DamselRescuingKnight(RescueDamselQuest quest){
   this.quest = quest;
}

或者添加一个策划人:

代码语言:javascript
复制
public void setDamselRescuingKnight(RescueDamselQuest quest){
   this.quest = quest;
}
票数 8
EN

Stack Overflow用户

发布于 2013-03-13 14:00:06

我给出的一个常见示例是,您希望打开一个文件,解析它,并得到一个数据类。大多数人会做这样的事情:

代码语言:javascript
复制
Data openAndParse(String filename) {
  ...openFile
  ...parse
}

通过这样做,文件打开方法和解析是高度耦合和难以测试的。如果您在打开和解析方面有问题,那么它是用于解析还是打开?

为了简单起见,为了简单起见,通过编写JUnit测试,您不得不做类似于.

代码语言:javascript
复制
BufferedReader openFile(String filename) {
  ...open file and return reader
}

Data parse(BufferedReader input) {
  ...parse and return data
}

JUnit引导我们找到一个更有凝聚力的解决方案。我们只需创建一个字符串,构造一个JUnit,然后是一个BufferedReader,就可以编写BufferedReader测试。你猜怎么着?非常类似的是,我们现在可以使用解析来接受来自各种来源的输入,而不仅仅是文件。

票数 2
EN

Stack Overflow用户

发布于 2013-03-13 13:45:46

很难进行测试,因为任务实现不能被替换掉。如果没有字节代码的修改,就没有一种简单的方法可以查看上船是否被调用。

如果可以在构造函数或setter中设置任务实现,则可以传递一个实现,该实现可以监视要启动的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15387010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档