Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用内部有mock的mock进行单元测试_Java_Unit Testing - Fatal编程技术网

Java 使用内部有mock的mock进行单元测试

Java 使用内部有mock的mock进行单元测试,java,unit-testing,Java,Unit Testing,我需要对某个方法进行单元测试,该方法适用于类型为X的对象。X对象有几个普通字段,如String、int等。但它也有一个类型为Y的列表。这种Y类型也相当复杂。让我的问题变得更难,假设Y型有另一个Z型列表 理想情况下,我需要模拟对象X,但告诉它在内部注入另一个Y类型的模拟,这也应该将另一个模拟Z注入自身(到Y)。我该怎么做 如果我有这么多级别的mock,我应该如何避免编写20个规范,说明这些mock在调用其方法时实际应该返回什么 或者这是一种我应该使用构建器并实际构建真实对象的问题 非常感谢, 鲍勃

我需要对某个方法进行单元测试,该方法适用于类型为X的对象。X对象有几个普通字段,如String、int等。但它也有一个类型为Y的列表。这种Y类型也相当复杂。让我的问题变得更难,假设Y型有另一个Z型列表

理想情况下,我需要模拟对象X,但告诉它在内部注入另一个Y类型的模拟,这也应该将另一个模拟Z注入自身(到Y)。我该怎么做

如果我有这么多级别的mock,我应该如何避免编写20个规范,说明这些mock在调用其方法时实际应该返回什么

或者这是一种我应该使用构建器并实际构建真实对象的问题

非常感谢, 鲍勃

编辑: 只是我脑海中的一个使用代码示例:

public String produceImportantStringOfImportantData(ObjectX x) throws ParseException {
    StringBuilder textResult = new StringBuilder();

    List<ObjectY> listOfY = x.getListOfY();

    if (listOfY.isValid()) {
        for (ObjectY y : listOfY) {
            for (ObjectZ z : y.getListOfZ()) {
                textResult.append("<font color='green'>").append(z.getField2).append("</font>").append(": ").append(z.getSomething())
                        .append(" Label : ").append(z.getParentComponent.getField()))
                        .append(" some important labels: ").append(z.getField()))
                        .append(" some important labels ").append(y.getAnotherField))
                        .append(" different, important label: ").append(y.getField()))
                        .append("<br/>");
            }
        }
    } 
    return textResult.toString();
}
公共字符串produceImportantStringOfImportantData(ObjectX x)引发异常{
StringBuilder textResult=新建StringBuilder();
List listOfY=x.getListOfY();
if(listOfY.isValid()){
for(ObjectY:listOfY){
for(ObjectZ:y.getListOfZ()){
textResult.append(“”).append(z.getField2.append(“”).append(“”):“”.append(z.getSomething())
.append(“标签:”).append(z.getParentComponent.getField())
.append(“一些重要标签:”).append(z.getField())
.append(“一些重要标签”).append(y.getAnotherField))
.append(“不同的、重要的标签:”).append(y.getField())
.追加(“
”); } } } 返回textResult.toString(); }
假设您正在使用类似的模拟框架,您只需执行以下操作:

X mockX = Mockito.mock(X.class);
Y mockX = Mockito.mock(Y.class);
Z mockX = Mockito.mock(Z.class);
Mockito.when(mockY.getZ()).thenReturn(mockZ);
Mockito.when(mockX.getY()).thenReturn(mockY);
如果这一点太深(您提到了20个规范),则可能表明您违反了或。在这种情况下,这意味着类本身执行了太多的逻辑,而不是在构造函数中接受一些执行实际工作的处理器


如果您愿意这样做,您可以单独轻松地测试处理器,并测试整个过程。

假设您正在使用类似的模拟框架,您可以简单地执行以下操作:

X mockX = Mockito.mock(X.class);
Y mockX = Mockito.mock(Y.class);
Z mockX = Mockito.mock(Z.class);
Mockito.when(mockY.getZ()).thenReturn(mockZ);
Mockito.when(mockX.getY()).thenReturn(mockY);
如果这一点太深(您提到了20个规范),则可能表明您违反了或。在这种情况下,这意味着类本身执行了太多的逻辑,而不是在构造函数中接受一些执行实际工作的处理器


如果您愿意这样做,您可以单独轻松地测试处理器,并测试整个过程。

请不要为此使用模拟,因为完全没有必要,但正如您已经意识到的,这将导致痛苦而脆弱的测试

或者这是一种我应该使用构建器并实际构建真实对象的问题


你甚至不需要一个构建器(尽管我推荐他们)——只需要使用一个真实的对象。使用真实对象将导致一个测试,该测试必须对重构具有更强的弹性,将测试您的代码实际在做什么,而不仅仅是您认为它是什么。

请不要为此使用模拟,因为绝对没有必要,但正如您已经意识到的,这将导致痛苦而脆弱的测试

或者这是一种我应该使用构建器并实际构建真实对象的问题


你甚至不需要一个构建器(尽管我推荐他们)——只需要使用一个真实的对象。使用真实对象将导致一个测试,该测试必须对重构更具弹性,将测试您的代码实际在做什么,而不仅仅是您认为它是什么。

请展示一个代码示例。手动连接HTML是一种邪恶。
标签也是如此。又是1997年吗?请给出一个代码示例。手动连接HTML是邪恶的。
标签也是如此。又是1997年吗?我不同意:当不在测试中的代码发生变化时,使用真实代码会导致单元测试失败,使测试对他们应该免疫的变化敏感。如果你的测试设计不好,那是肯定的。OP讨论的是使用价值对象,而不是可以弹性播种的合作者。Mock是一种替代在测试中难以使用和/或使用缓慢的协作者的方法,而不是将每个人都与其他人完全隔离的方法。我不同意:当未在测试中的代码发生更改时,使用真实代码将导致单元测试失败,使测试对他们应该不受影响的更改敏感。如果你的测试设计不好,它将是肯定的。OP讨论的是使用价值对象,而不是可以弹性播种的合作者。mock是一种替代在测试中难以使用和/或使用缓慢的协作者的方法,而不是将每个协作者与其他所有协作者完全隔离的方法