mockito3.4.0+java7+junit5 写模拟静态方法的单元测试
时间: 2024-12-16 12:25:32 浏览: 11
Mockito是一个流行的Java库,用于编写单元测试,它允许开发者模拟和验证对象的行为,包括静态方法。在Mockito 3.4.0及更高版本以及Java 7和JUnit 5组合下,虽然直接模拟静态方法并不推荐,因为静态方法无法注入到依赖注入容器中,但可以借助一些技巧来实现。
首先,你需要了解静态方法通常在设计模式上被视为“紧耦合”,在测试中模拟它们可能会导致测试变得复杂并且难以维护。然而,如果你确实需要测试这样的方法,可以采用以下步骤:
1. 使用PowerMockito:PowerMockito是一个增强版的Mockito,它支持对静态方法、final类和不可变类的mock。要在项目中引入PowerMockito,添加相应的Maven或Gradle依赖。
```xml
<!-- Maven -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit5</artifactId>
<version>3.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>3.9.0</version>
<scope>test</scope>
</dependency>
// Gradle
dependencies {
testImplementation 'org.mockito:mockito-core:3.12.4'
testImplementation 'org.powermock:powermock-module-junit5:3.9.0'
testImplementation 'org.powermock:powermock-api-mockito2:3.9.0'
}
```
2. 在测试类上添加@RunWith(PowerMockRunner.class)注解,并指定@PrepareForTest({YourClassWithStaticMethod.class}),告诉PowerMockito你要模拟那个类。
3. 使用`when()`和`thenReturn()`来模拟静态方法的行为:
```java
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.MockedStatic;
import org.powermock.core.classloader.annotations.PrepareForTest;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(YourClassWithStaticMethod.class)
public class YourTestClass {
@InjectMocks
private YourDependencyObject obj;
@Test
void yourTestMethod() {
// 创建一个静态方法的模拟对象
MockedStatic<YourClassWithStaticMethod> mockedStatic = mockStatic(YourClassWithStaticMethod.class);
// 模拟静态方法返回值
when(YourClassWithStaticMethod.yourStaticMethod()).thenReturn(yourExpectedResult);
// 执行你的依赖方法,这将触发静态方法的模拟
obj.callThatUsesStaticMethod();
// 验证静态方法是否按照预期被调用
mockedStatic.verify().yourStaticMethod();
// 清理模拟
mockedStatic.close();
}
}
```
阅读全文