Unit testing Mockist tdd:当协作者只能在UUT内部构建时,如何测试UUT?

Unit testing Mockist tdd:当协作者只能在UUT内部构建时,如何测试UUT?,unit-testing,mocking,tdd,bdd,Unit Testing,Mocking,Tdd,Bdd,我正在尝试对一个名为StringReader的Java对象进行行为测试。代码如下所示: public interface CharReader { public char readChar(); } public class ByteArrayCharReader implements CharReader { public ByteArrayCharReader(byte[] bytes); public char readChar(); } public class

我正在尝试对一个名为StringReader的Java对象进行行为测试。代码如下所示:

public interface CharReader {
  public char readChar();
}    

public class ByteArrayCharReader implements CharReader {
  public ByteArrayCharReader(byte[] bytes);
  public char readChar();
}

public class StringReader {
  public String readString(byte[] bytes);
}
StringReader的协议/责任是:

  • 调用readString时,StringReader应重复调用CharReader.readChar()从字节数组中读取字符,直到遇到空终止字符或最大字符数为20为止。这个想法是StringReader不应该为正确的unicode字符解码中的所有完整内容而烦恼,这样的责任就委托给了字符阅读器
我想为StringReader编写一个表示此协议的单元测试,但我似乎不知道如何进行

首先,我想我只是想让StringReader在内部创建一个ByteArrayCharReader,并在字节数组上使用它,它是在readString()中提交的,但这似乎没有意义,因为我无法从外部模拟它

看来我遇到了鸡和蛋的问题。我想将ByteArrayCharReader注入StringReader,但ByteArrayCharReader必须使用字节数组构造,该字节数组只有在调用readString时才可用-因此,如果无法从外部构造/模拟它,我如何传递它?。这似乎是一个愚蠢的问题,因为理论上我知道传递给readString的字节数组实际上来自测试,而ByteArrayCharReader也来自测试,所以我确实准备好了“在那里”的参数。也许我错过了什么

我应该提到的是,我正在处理遗留代码库,因此无法轻松更改StringReader.readString的接口

我有点沮丧,我不知道如何解决这个问题,因为这似乎是一个非常简单的场景;A被传递到一个数组,并希望使用ArrayParser解析该数组-如何以行为方式(非基于状态)测试此操作?

您可以使用。您不需要通过tearraycharreader注入/实例化
ByteArrayCharReader
,而只需注入工厂,工厂的纯工作是提供请求的读卡器的实例:

public class ReadersFactoryImpl implements ReadersFactory {
    public CharReader CreateByteReader(byte[] content) {
        return new ByteArrayCharReader(content);
    }
}
就这些。您可以轻松地模拟它并设置它,以便它返回另一个模拟。测试
StringReader
是否按预期调用其他读取器就足够了