首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerMock whenNew替代方案

PowerMock whenNew替代方案
EN

Stack Overflow用户
提问于 2022-05-22 11:30:12
回答 1查看 917关注 0票数 1

我不想再用强力模拟了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。

如您所知,您可以使用whenNew关键字创建类的实例。

在Junit5 for whenNew中有其他选择吗?

下面是我代码的一部分:

代码语言:javascript
复制
                whenNew(PDFDocument.class).withNoArguments().thenReturn(pdfDocument);
                whenNew(PSConverter.class).withNoArguments().thenReturn(converter);
                doNothing().when(pdfDocument).load(ArgumentMatchers.any(ByteArrayInputStream.class));
                doAnswer(invocationOnMock -> {
                    ByteArrayOutputStream outputStream = invocationOnMock.getArgument(1);
                    outputStream.write(content);
                    return outputStream;
                }).when(converter).convert(ArgumentMatchers.any(), ArgumentMatchers.any(ByteArrayOutputStream.class));
EN

Stack Overflow用户

回答已采纳

发布于 2022-05-22 13:55:06

根据文档的说法,从Mockito3.5.0开始就可以使用模拟对象构造。

首先,需要将mockito内嵌而不是mockito-core添加到测试依赖项中。

mockito-inline提供了模拟静态或最终方法、构造函数的能力。mockito核与mockito内联的区别

代码语言:javascript
复制
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-inline</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>

让我们为测试实例化对象创建一个简单的服务。

代码语言:javascript
复制
public class A {
    private final String test;

    public A(String test) {
        this.test = test;
    }

    public String check() {
        return "checked " + this.test;
    }
}

public class B {
    private String check = " B check ";

    public String check() {
        return check;
    }

}

public class TestService {
    public String purchaseProduct(String param) {
        A a = new A(param);
        B b = new B();
        return a.check() + b.check();
    }
}

带有注释的构造函数模拟示例:

代码语言:javascript
复制
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;
import org.mockito.Mockito;

import static org.mockito.Mockito.when;

public class ConstructorMockTest {
    @Test
    public void test_mocked_construction()  {
        try (
             //create mock for object A
             MockedConstruction<A> mockedA = Mockito.mockConstruction(A.class,
                (mock, context) -> {
                    //set return value for object A mock methods
                    when(mock.check()).thenReturn(" Constructor Mock A ");
             });
             //create mock for object B
             MockedConstruction<B> mockedB = Mockito.mockConstruction(B.class,
                     (mock, context) -> {
                         //set return value for object B mock methods
                         when(mock.check()).thenReturn(" Constructor Mock B ");
             }))
        {
            // every A object creation is current try() scope returning a mock
            A aObject = new A("test");
            Assertions.assertEquals( aObject.check(), " Constructor Mock A ");

            // every B object creation is current try() scope returning a mock
            B bObject = new B();
            Assertions.assertEquals( bObject.check(), " Constructor Mock B ");

            //Example of testing service which creates A and B objects
            TestService service = new TestService();
            String serviceResult = service.purchaseProduct("test");

            Assertions.assertEquals(serviceResult, " Constructor Mock A  Constructor Mock B ");
        }
    }
}

在您的课程中,例如:

代码语言:javascript
复制
    @Test
    public void test() {
        byte[] content = new byte[] {1,1};

        try (
                MockedConstruction<PDFDocument> mockedPDFDocument = Mockito.mockConstruction(PDFDocument.class,
                        (mock, context) -> {
                            doNothing().when(mock).load(ArgumentMatchers.any(ByteArrayInputStream.class));
                        });

                MockedConstruction<PSConverter> mockedPSConverter = Mockito.mockConstruction(PSConverter.class,
                        (mock, context) -> {
                            doAnswer(invocationOnMock -> {
                                ByteArrayOutputStream outputStream = invocationOnMock.getArgument(1);
                                outputStream.write(content);
                                return outputStream;
                            }).when(mock).convert(ArgumentMatchers.any(), ArgumentMatchers.any(ByteArrayOutputStream.class));
                        }))
        {
            //call services which instantiates PDFDocument and PSConverter
            PDFDocument pdfDocument = new PDFDocument();
            PSConverter psConverter = new PSConverter();

            Assertions.assertTrue(org.mockito.internal.util.MockUtil.isMock(pdfDocument));
            Assertions.assertTrue(org.mockito.internal.util.MockUtil.isMock(psConverter));
        }
    }
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72337164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档