当前位置: 首页 > 知识库问答 >
问题:

PowerMock当新的替代方案

许振海
2023-03-14

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

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

Junit5中是否有其他选择?

以下是我的代码的一部分:

                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));

共有1个答案

邵伟泽
2023-03-14

根据留档,从Mockito 3.5.0开始就可以使用模拟对象构造。
首先,您需要将mockito-inline而不是mockito-core添加到您的测试依赖项中。
mockito-inline提供了模拟静态或最终方法、构造函数的能力。mockito-core与mockito-inline之间的区别

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-inline</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>

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

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();
    }
}

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

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 ");
        }
    }
}

对于您的课程示例:

    @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));
        }
    }
 类似资料:
  • 问题内容: 我有一个viewcomponent,其中包含一些嵌入在各个页面中的可重用业务逻辑。这一直很好。但是,我现在需要使用ajax刷新viewcomponent。 有什么办法可以做到这一点?从我所读的内容来看,这是不可能的,尽管该信息有些过时了。如果不可能的话,最好的选择是什么? 问题答案: 在beta7上,现在可以直接从控制器返回ViewComponent。查看公告的“ MVC /剃刀”部分

  • 我正在阅读下面Joe Albahari优秀的“C9简而言之”的摘录,并试图理解这里用粗体描述的内容。有人能用我更能理解的方式解释替代方法吗?出于某种原因,这对我来说似乎有些落后。

  • 问题内容: 出于各种原因,在编写 Java应用程序时 ,调用会被皱眉,所以如何通知调用过程并非一切都按计划进行? 编辑: 1是任何非零退出代码的。 问题答案: 当“应用程序”实际上是较大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时,对的使用会被拒绝:在这种情况下,它可能会停止JVM并因此停止所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务

  • 问题内容: 我知道这个话题已经解决了上千次。但是我找不到解决办法。 我正在尝试计算列表(df2.list2)的列中出现列表(df1.list1的每一行)的频率。所有列表仅包含唯一值。List1包含约300.000行,list2包含30.000行。 我有一个有效的代码,但是它的运行速度非常慢(因为我使用的是迭代程序)。我也尝试过itertuples(),但它给了我一个错误(“要解压缩的值太多(预期2

  • 允许我填充包含复选框和单选按钮的HTML表单的替代方法。 我已经设法使用eclipse中的HtmlUnit库将数据发送到html表单并检索页面(我已经发布了下面的Java代码)。 然而,当我将这些代码复制到我的Android项目中时,我发现Android不支持HtmlUnit库。 对于Android来说,HtmlUnit还有其他替代方案吗?另一种方法应该能够将文本、复选框、单选按钮填写到Html表

  • 问题内容: 以前,我总是以为Vector在长度未知的情况下可以很好地用于非描述对象。据我所知,我也认为它也是线程安全的 有什么改变不应该再使用了,替代方案是什么? 问题答案: 您应该使用而不是。虽然使用了内部同步,但是对于实际的一致性而言,这很少够用,只会在真正不需要时降低执行速度。 另请参阅此stackoverflow问题。