当前位置: 首页 > 编程笔记 >

mockito BDDMockito风格

司徒云
2023-03-14
本文向大家介绍mockito BDDMockito风格,包括了mockito BDDMockito风格的使用技巧和注意事项,需要的朋友参考一下

示例

行为驱动开发(BDD)测试样式围绕测试的“给定”,“何时”和“然后”阶段进行。但是,古典Mockito在“给定”阶段使用“何时”一词,并且不包括可以包含BDD的其他自然语言构造。因此,在1.8.0版中引入了BDDMockito别名,以便于进行行为驱动的测试。

最常见的情况是存根方法的返回值。在以下示例中,如果使用等于的参数调用getStudent(String),则嘲笑的方法StudentRepository将返回。new Student(givenName, givenScore)givenName

import static org.mockito.BDDMockito.*;

public class ScoreServiceTest {

    private StudentRepository studentRepository = mock(StudentRepository.class);

    private ScoreService objectUnderTest = new ScoreService(studentRepository);

    @Test
    public void shouldCalculateAndReturnScore() throws Exception {
        //given
        String givenName = "Johnny";
        int givenScore = 10;
        given(studentRepository.getStudent(givenName))
            .willReturn(new Student(givenName, givenScore));

        //when
        String actualScore = objectUnderTest.calculateStudentScore(givenName);

        //then
        assertEquals(givenScore, actualScore);
    }
}

有时需要检查从依赖关系抛出的异常是否在被测试方法中得到了正确处理或重新抛出。这样的行为可以通过以下方式在“给定”阶段中消除:

willThrow(new RuntimeException())).given(mock).getData();

有时,需要设置一些存根方法应该引入的副作用。特别是在以下情况下可以派上用场:

  • 存根方法是一种应该更改传递对象内部状态的方法

  • 存根方法是空方法

可以在“给定”阶段使用“答案”来纠正此类行为:

willAnswer(invocation -> this.prepareData(invocation.getArguments()[0])).given(mock).processData();

当需要验证与模拟的交互时,可以使用should()或should(VerificationMode)(仅从1.10.5开始)方法在“然后”阶段中完成:

then(mock).should().getData(); // 验证一次getData()被调用
then(mock).should(times(2)).processData(); // 验证是否两次调用了processData()

当需要验证除了已验证之外,没有其他与模拟的交互时,可以在“然后”阶段使用shouldHaveNoMoreInteractions()(自2.0.0开始):

then(mock).shouldHaveNoMoreInteractions(); // 经典Mockito中verifyVerMoreInteractions(mock)的类似物

当需要验证与某个模拟绝对没有交互时,可以在“然后”阶段使用shouldHaveNoMoreInteractions()(自2.0.0开始)完成:

then(mock).shouldHaveZeroInteractions(); // 经典Mockito中verifyZeroInteractions(mock)的类似物

当需要检查是否按顺序调用了方法时,可以在“然后”阶段使用should(InOrder)(自1.10.5起)和should(InOrder, VerificationMode)(自2.0.0起)进行操作:

InOrder inOrder = inOrder(mock);

// 在这里测试身体

then(mock).should(inOrder).getData(); // 模拟的第一次调用应该是getData()调用
then(mock).should(inOrder, times(2)).processData(); // 模拟中的第二个和第三个调用应该是processData()调用
           

 类似资料:
  • camelCase 很糟 你曾维护过别人的代码吗?你维护过像这样的代码吗? my $variableThatContainsData = someSubroutineThatMucksWithData( $someAwfulVariable ); 混合大小写单词在 Perl 世界被称为 camelCase,通常它的令人不悦之处是使 阅读代码更难。 甚至具有糟糕名称的代码使用下划线也能变得

  • Style Java 传统的代码风格是被用来编写非常复杂的企业级 JavaBean。新的代码风格看起来会更加整洁,更加正确,并且更加简单。 Structs 对我们程序员来说,包装数据是最简单的事情之一。下面是传统的通过定义一个 JavaBean 的实现方式: public class DataHolder { private String data; public DataHold

  • 如果一定要把一般的API 服务转换成restful风格,可以自定义控制器。例如上一节的服务例子: 方法 restful url 功能 原 url 原方法 GET /website 查询记录列表 /website/list.java GET POST /website 创建一条记录 /website/insert.java POST GET /website/id 根据id查询记录 /website

  • 如果有人问起 Python 程序员他们最喜欢 Python 哪一点,他们一定会提到 Python 的高可读性。确实,对于 Python 来说,其高可读性一直是 Python 这门语言设计的核心。一个不争的事实是,相对于写代码而言,读代码才是更加平常的事情。 Python 代码有高可读性的一个原因就是其有着相对而言更加完善的编码风格准则和 「Python化」习语。 当 Python 老手(Pytho

  • 介绍 在参与 Vant 开发时,请遵守约定的单文件组件风格指南,指南内容节选自 Vue 官方风格指南。 组件数据 组件的 data 必须是一个函数。 // bad export default { data: { foo: 'bar', }, }; // good export default { data() { return { foo: 'bar',

  • 语法 UTF-8编码 Unix换行符,每行120字符 缩进符用4个空格,需要设定编辑器tab转4空格 花括号独占一行 函数与函数间使用一个空行分割 能使用静态内联(static sw_inline)就不要用宏 能用enum枚举就不要用宏 代码可读性比性能更重要 标签 label必须以下划线开头,用于goto语句 label必须独占一行 枚举 命名必须为sw{模块名称}_{作用},如:swServe