Mockito打桩构造函数和静态方法

单体测试中,需要模拟测试对象方法内创建的新对象的动作

        try (var mocked = mockConstruction(Sample.class, (mock, context)-> {
            // 在测试方法内每次创建Sample对象时,会得到模拟对象mock,对mock进行打桩
            when(mock.method1(any())).thenReturn("abcd");
        })) {
            // 执行测试方法
        }

单体测试中,需要模拟测试对象方法内调用的另一个类的静态方法

        // 对有参数的静态方法进行打桩
        try (var mocked = mockStatic(Sample.class)) {
            mocked.when(() -> Sample.method1(any(String.class)))
                .thenAnswer(invocation -> {
                    var arg1 = (String) invocation.getArgument(0);
                    // 做一些操作

                    // 当静态方法返回值类型为void时,固定返回null,否则返回对应类型的值就行
                    return null;
            });

            // 执行测试方法

            // 验证静态方法被执行一次
            mocked.verify(()->Sample.method1("abcd"), times(1));
        }

        // 对无参数的静态方法进行打桩,官方示例
        try (var mocked = mockStatic(Foo.class)) {
            mocked.when(Foo::method).thenReturn("bar");
            assertEquals("bar", Foo.method());
            mocked.verify(Foo::method);
        }

注意:两种打桩方式,都需要放在try() {}块里,或者在@BeforeEach方法中创建,在@AfterEach方法中调用close()方法手动关闭。否则会影响相同测试线程中的后续测试。

你可能感兴趣的:(JAVA,测试,java,单元测试,junit,mockito)