繁体   English   中英

Java如何在Java中模拟对象和静态方法?

[英]Java How to mock the object and static method in java?

我正在编写一个CustomerHelper的junit,它在内部调用AccountHelper对象的方法。 CustomerHelper正在使用其方法之一中的新运算符创建AccountHelper对象。 现在,如果我想模拟AccountHelper对象。 有什么办法可以做到吗?

如果此依赖项(在这种情况下为AccountHelper)由某些设置者或构造函数注入,则可以设置MockAccountHelper。 对? 但是,当我们使用New运算符创建依赖项时,有什么方法可以进行模拟?

第二个问题:-无论如何,我们是否可以使用核心Java库来模拟静态方法而无需使用Power / Easy Mock?即使我进行了电源模拟,也想简单地了解它在内部的作用吗?

JMockit允许您轻松模拟静态方法和内部构造的对象。

您将执行以下操作:

@Test
public void testWhatever() {
    new Expectations() {
        AccountHelper accountHelper;
        {
            new AccountHelper();
            accountHelper.someMethod();
    }}
    objectUnderTest.doWhatever();
}

我认为核心Java库中没有内置方法可以模拟静态方法。 我也不确定内部到底发生了什么,但是我认为JMockit会进行某种字节码级别的修补来动态替换类。

有powermockito库可用于模拟测试类中的静态方法调用。 powermockito库的Maven存储库为:

<dependency>
 <groupId>org.powermock</groupId>
 <artifactId>powermock-api-mockito</artifactId>
 <version>1.6.6</version>
</dependency>

如果您需要有关powermockito的更多信息,请单击此处的链接

测试静态方法时,我使用以下代码结构。

Powermock.mockStatic(Something.class)

Something.someMethod(); // Static Method you want to mock
EasyMock.expectLastCall().andReturn(/*Whatever you want to return*/);

Powermock.replay(Something.class);

// Call which makes use of Something.someMethod

Powermock.verify(Something.class);

理想情况下,您不需要测试静态方法。 PowerMock是一个Java框架,允许您对通常认为不可测试的代码进行单元测试。

您将需要一种在测试案例中将AccountHelper所需的模拟集设置为CustomerHelper的方法。 因此,您的CustomerHelper类将需要AccountHelper的设置器或可以传递所需AccountHelper的构造函数。 我想,如果AccountHelper在方法中本地实例化,则无法设置模拟。 您无权从外部访问它(例如junit测试用例),它的作用域仅在您的方法本地。

您不能模拟静态方法。 我想模拟库使用一些字节码生成库(例如http://asm.ow2.org/index.htmlhttp://cglib.sourceforge.net/) 动态创建模拟,字节码框架将在运行时生成模拟类字节码。 他们通过覆盖方法来做到这一点。 但是静态方法不能被覆盖。

提比留

如果此依赖项(在这种情况下为AccountHelper)是由某些设置器或构造函数注入的,则可以设置MockAccountHelper.Right吗? 但是,当我们使用New运算符创建依赖项时,有什么方法可以进行模拟?

是的-没错,但是更重要的是,注入对象是让对象的类型实现一个接口,然后该接口也可以由模拟类型使用。 没有明确接口的模拟类型的问题在于,要创建并行的模拟类型以确保遵守原始合同,同时又要改变实现,这并不容易。

在您的情况下,我认为唯一可行的方法是创建一个新类型的AccountHelperMock ,该类型可以扩展AccountHelper并覆盖所有方法(希望如此)。 然后在您的代码中将new AccountHelper()替换为new AccountHelperMock() ,以在其中进行模拟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM