Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何在Java中模拟对象和静态方法?_Java_Mocking - Fatal编程技术网

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

Java如何在Java中模拟对象和静态方法?,java,mocking,Java,Mocking,我正在编写CustomerHelper的junit,它在内部调用AccountHelper对象的方法。CustomerHelper正在创建 AccountHelper对象的一个方法中包含新运算符。现在,如果我想模拟AccountHelper对象。有什么方法可以做到吗? 如果这个依赖项(本例中为AccountHelper)是由某个setter或构造函数注入的,那么我可以设置我的MockAccountHelper。对吗? 但是,当我们使用新操作符创建依赖项时,有没有办法进行模拟? 第二个问题:-我们

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

如果这个依赖项(本例中为AccountHelper)是由某个setter或构造函数注入的,那么我可以设置我的MockAccountHelper。对吗? 但是,当我们使用新操作符创建依赖项时,有没有办法进行模拟?

第二个问题:-我们是否可以使用核心java库模拟静态方法而不使用Power/Easy mock?即使我使用Power mock,想简单地了解它是如何在内部进行的?允许您轻松模拟静态方法和内部构造的对象

你可以这样做:

@Test
public void testWhatever() {
    new Expectations() {
        AccountHelper accountHelper;
        {
            new AccountHelper();
            accountHelper.someMethod();
    }}
    objectUnderTest.doWhatever();
}
我不相信在核心Java库中有内置的模拟静态方法的方法。我也不确定内部到底发生了什么,但我认为JMockit进行了某种字节码级别的修补,以动态替换类。

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

你可以这样做:

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

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

在测试用例中,您需要一种方法将所需的AccountHelper模拟设置为您的CustomerHelper。因此,CustomerHelper类需要AccountHelper的setter或可以传递所需AccountHelper的构造函数。 如果AccountHelper是在方法中本地实例化的,我想您没有办法设置模拟。您不能从外部访问它(比如junit测试用例),它的作用域只是您的方法的局部

不能模拟静态方法。我猜模拟库使用一些字节码生成库动态地创建模拟,例如 或 字节码框架将在运行时生成模拟类字节码。它们通过重写方法来实现。但是静态方法不能被重写


Tiberiu

在测试用例中,您需要一种方法将所需的AccountHelper模拟设置为您的CustomerHelper。因此,CustomerHelper类需要AccountHelper的setter或可以传递所需AccountHelper的构造函数。 如果AccountHelper是在方法中本地实例化的,我想您没有办法设置模拟。您不能从外部访问它(比如junit测试用例),它的作用域只是您的方法的局部

不能模拟静态方法。我猜模拟库使用一些字节码生成库动态地创建模拟,例如 或 字节码框架将在运行时生成模拟类字节码。它们通过重写方法来实现。但是静态方法不能被重写

提比略

如果这个依赖项(在本例中是AccountHelper)是由某个setter或构造函数注入的,那么我可以设置我的MockAccountHelper,对吗?但是,当我们使用新操作符创建依赖项时,有什么方法可以进行模拟吗

是的-没错,但更重要的是,注入对象是让对象类型实现一个接口,该接口也可以被mocking类型使用。没有任何清晰接口的模拟类型的问题在于,在改变实现的同时,创建保证遵守原始契约的并行模拟类型并不容易

在您的案例中,我认为唯一可行的方法是创建一个新类型
AccountHelperMock
,它扩展
AccountHelper
,并覆盖所有方法(我希望它可以)。然后在代码中手动将
new AccountHelper()
替换为
new AccountHelperMock()

如果这个依赖项(在本例中是AccountHelper)是由某个setter或构造函数注入的,那么我可以设置我的MockAccountHelper,对吗?但是,当我们使用新操作符创建依赖项时,有什么方法可以进行模拟吗

是的-没错,但更重要的是,注入对象是让对象类型实现一个接口,该接口也可以被mocking类型使用。没有任何清晰接口的模拟类型的问题在于,在改变实现的同时,创建保证遵守原始契约的并行模拟类型并不容易


在您的案例中,我认为唯一可行的方法是创建一个新类型
AccountHelperMock
,它扩展
AccountHelper
,并覆盖所有方法(我希望它可以)。然后在您的代码中,手动将
new AccountHelper()
替换为
new AccountHelperMock()
以模拟此操作。

有powermockito库可用于模拟测试类内的静态方法调用。powermockito库的maven存储库是:

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

org.powermock

.

有一个powermockito库可用于模拟测试类内的静态方法调用。powermockito库的maven存储库是:

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

org.powermock

.

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

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

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

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

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

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

谢谢。我想它一定是通过客户级的lodaer来完成的。我们将就此提出另一个问题。谢谢