当使用单元测试模拟对象

JLE:

我知道,大约有嘲讽和测试的许多问题,但我没有发现任何帮助我很好,所以我还是有了解follwing问题:

请纠正我,如果我得到这个错误的,但据我看到的,单元测试用于测试一个特定类的业务逻辑隔离,如果有来自外部的任何需要的对象,他们会被嘲笑。因此,举例来说,如果我有一个简单的城市,增加了公民的列表,并通过他们的名字返回公民的公民管理系统(Assumtion:公民只包含一些基本的个人信息),就像这样:

public class ProcessClass {

    ArrayList<Citizen> citizenList = new ArrayList<Citizen>();

    public void addCitizen(Citizen citizen) {
        citizenList.add(citizen);
    }

    public Citizen getByName(String name) {
        for (Citizen c : citizenList) {
            if (c.getName().equals(name)) {
                return c;
            }
        }
        return null;
    }

}

如果现在我想单元测试我ProcessClass做我认为Citizen是必须被嘲笑的外部特征,还是我只是简单地创建一个Citizen用于测试目的?如果他们被嘲笑,我将如何进行测试,以获得其名称的对象的方法,因为模仿对象不包含参数?

计步器:

如果他们被嘲笑,我将如何进行测试,以获得其名称的对象的方法,因为模仿对象不包含参数?

你可以嘲笑调用getName,使用为的Mockito例如:

Citizen citizen = mock(Citizen.class);
when(citizen.getName()).thenReturn("Bob");

这里是你的方法测试的例子

ProcessClass processClass = new ProcessClass();

Citizen citizen1 = mock(Citizen.class);
Citizen citizen2 = mock(Citizen.class);
Citizen citizen3 = mock(Citizen.class);

@Test
public void getByName_shouldReturnCorrectCitizen_whenPresentInList() {
    when(citizen1.getName()).thenReturn("Bob");
    when(citizen2.getName()).thenReturn("Alice");
    when(citizen3.getName()).thenReturn("John");

    processClass.addCitizen(citizen1);
    processClass.addCitizen(citizen2);
    processClass.addCitizen(citizen3);

    Assert.assertEquals(citizen2, processClass.getByName("Alice"));
}

@Test
public void getByName_shouldReturnNull_whenNotPresentInList() {
    when(citizen1.getName()).thenReturn("Bob");

    processClass.addCitizen(citizen1);

    Assert.assertNull(processClass.getByName("Ben"));
}

注意:

我会建议嘲讽。比方说,你写的100个测试你实例化一个Citizen类这样

Citizen c = new Citizen();

而几个月后,你的构造变化采取一种说法,这本身也是一个对象,类City的实例。现在你要回去和更改所有这些测试,并写:

City city = new City("Paris");
Citizen c = new Citizen(city);

如果你嘲笑Citizen,开始时,你就不会需要。

现在,因为它是POJO及其GetName方法的构造可能不会改变,而不是嘲讽应该还是好的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在单元测试中使用补丁时模拟对象的顺序

使用 jasmine 进行单元测试时模拟全局对象

如何使用模拟对象编写单元测试?

使用单元测试模拟服务类

模拟对象不能在单元测试中使用 ModelMapper 转换为实体对象

在使用nSubstitute和Autofixture作为DI容器的单元测试中,如何获取模拟对象?

如何使用 Visual Studio 单元测试框架或 NUnit 框架在 C# 中模拟对象?

如何在Angular 8中使用对象模拟数组数据以进行单元测试

相关对象的Django单元测试模拟查询集

如何在Perl单元测试中重用模拟对象?

创建模拟数据对象以进行单元测试

如何模拟Android NFC Tag对象以进行单元测试

单元测试功能,如何实现对模拟对象的调用

在 Scala 中进行单元测试的对象方法模拟或监视

模拟单元测试中的UserDefaults对象,返回_ArrayBuffer

Kotlin单元测试-如何模拟Companion对象的组件?

如何模拟spacy模型/ Doc对象进行单元测试?

集成测试是否应该重做使用模拟的单元测试?

单元测试不使用派生对象

模拟Typescript单元测试

单元测试-模拟困难

单元测试+模拟+ UWSGI

我是否应该在带有不可变对象的单元测试中使用真实对象或模拟对象?

单元测试方法在运行测试时不使用模拟对象。而是调用实际的类和方法

单元测试如何使用Mockito模拟存储库

如何使用Mockito模拟静态方法以进行单元测试

Android 本地单元测试 - 使用 MockK 模拟 FirebaseAuth

在Python中使用模拟进行单元测试

节点,使用sinon进行单元测试和模拟