使用PowerMockito对私有private方法及异常进行测试

注意不是mock私有方法

假如对下面的代码进行测试:

public class Service {
	private int getBackupSize(String backupId, String keycloakToken) {
		//some code......
        try {
            backup = os.blockStorage().backups().get(backupId);
            return backup.getSize();
        } catch (Exception e) {
            throw new EbsInternalServerException(EbsExceptionConstant.ERROR_CODE,
                    EbsExceptionConstant.ERROR_MESSAGE);
        }
	}
}

此时 @Rule 来判断异常的方式就行不通了,回归传统的 try...catch 方案。测试代码使用反射获取private方法,代码如下:

@Test
public void testWithException() {
    //mock other codes...
    try {
    	//String.class表示参数的类型,有几个参数就写几个
        Method method = PowerMockito.method(Service.class, "getBackupSize", String.class, String.class);
        method.invoke(service, "123", "123");
    } catch (Exception e) {
		//对异常进行断言
        Assert.assertEquals(EbsExceptionConstant.ERROR_MESSAGE, e.getCause().getMessage());
    }
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PowerMockito是一个用于Java单元测试的工具,它可以用来测试私有方法使用PowerMockito方法是在测试类上使用@PowerMock注解,并在测试方法使用PowerMockito.spy()来创建被测试类的spy对象,然后使用PowerMockito.when()来指定私有方法的返回值或执行其他操作。 例如: ``` @RunWith(PowerMockRunner.class) @PrepareForTest(MyClass.class) public class MyClassTest { @Test public void testPrivateMethod() throws Exception { MyClass myClass = PowerMockito.spy(new MyClass()); PowerMockito.when(myClass, "privateMethod").thenReturn("Hello PowerMockito"); String result = myClass.publicMethod(); assertEquals("Hello PowerMockito", result); } } ``` 请注意,使用PowerMockito进行单元测试可能会使测试变得复杂和难以维护,因此在使用PowerMockito之前需要谨慎考虑。 ### 回答2: PowerMockito 是一个基于 Mockito 和 JUnit 的 Java 测试框架,它可以用于测试那些无法使用传统单元测试框架测试的代码,如静态方法私有方法、构造函数等等。 测试私有方法可以用 PowerMockito 来实现,主要分为 3 个步骤: 1. 引入 PowerMockito 首先需要引入 PowerMockito 库,它需要依赖 Mockito 和 JUnit。可以通过 Maven 或 Gradle 来引入。 ```xml <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.7.7</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> ``` 2. 使用 PowerMockito.mock 方法来创建被测试对象 使用 PowerMockito.mock 方法来创建被测试对象,然后再对其私有方法进行测试: ```java public class TestClass { private String privateMethod() { return "Hello, World!"; } } @RunWith(PowerMockRunner.class) @PrepareForTest(TestClass.class) public class TestClassTest { @Test public void testPrivateMethod() throws Exception { TestClass testClass = PowerMockito.mock(TestClass.class); PowerMockito.when(testClass, "privateMethod").thenReturn("Hello, PowerMockito!"); assertEquals("Hello, PowerMockito!", Whitebox.invokeMethod(testClass, "privateMethod")); } } ``` 在这个示例中,我们使用了 @PrepareForTest 注解来告诉 PowerMockito 需要准备被测试的类。然后我们使用 PowerMockito.mock 方法来创建 TestClass 的一个模拟对象 testClass ,并使用 PowerMockito.when 方法来告诉 PowerMockito调用 privateMethod 方法时应该返回什么值。最后我们使用 Whitebox.invokeMethod 来调用模拟对象的私有方法。 3.使用 PowerMockito.spy 方法来实现部分模拟 有时我们需要对一个对象进行部分模拟(mock 部分方法,而保留其它方法的真实实现)。此时可以使用 PowerMockito.spy 方法来创建被测试对象。 ```java public class TestClass { private String privateMethod() { return "Hello, World!"; } public String publicMethod() { return "Hello, PowerMockito!"; } } @RunWith(PowerMockRunner.class) @PrepareForTest(TestClass.class) public class TestClassTest { @Test public void testPrivateMethod() throws Exception { TestClass testClass = PowerMockito.spy(new TestClass()); PowerMockito.when(testClass, "privateMethod").thenReturn("Hello, PowerMockito!"); assertEquals("Hello, PowerMockito!", Whitebox.invokeMethod(testClass, "privateMethod")); assertEquals("Hello, PowerMockito!", testClass.publicMethod()); } } ``` 在这个示例中,我们使用 PowerMockito.spy 方法来创建 TestClass 的一个继承自原始对象的部分模拟对象 testClass 。接下来我们使用 PowerMockito.when 方法来告诉 PowerMockito调用 privateMethod 方法时应该返回什么值。最后我们可以测试模拟对象的私有方法和公有方法。 ### 回答3: PowerMockito是一个mock testing框架,它可以帮助我们进行单元测试。当我们需要测试一个类的私有方法时,PowerMockito可以提供很好的解决方案。 为了测试私有方法,我们可以使用PowerMockito.whenNew()方法来模拟对象,并使用PowerMockito.spy()方法来创建一个对象的spy对象,然后使用这个对象来调用私有方法。 以下是使用PowerMockito测试私有方法的步骤: 1. 引入PowerMockito依赖:在项目的pom文件中添加以下依赖: ``` <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <version>2.0.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.0</version> <scope>test</scope> </dependency> ``` 2. 创建一个需要测试的类: ``` public class User { private String name; private int age; private String address; private String phoneNumber; private boolean isLegalAge(int age) { return age >= 18; } private boolean isValidPhone(String phoneNumber) { return phoneNumber.matches("^(?:(?:\\+|00)(\\d{1,3})[\\s-]?)?(\\d{8,14})$"); } public boolean isValidUser() { return isLegalAge(age) && isValidPhone(phoneNumber); } } ``` 3. 创建一个测试类,并使用PowerMockito测试私有方法: ``` @RunWith(PowerMockRunner.class) @PrepareForTest(User.class) public class UserTest { @Test public void testIsValidPhone() throws Exception { User user = new User(); User spy = PowerMockito.spy(user); // 使用spy()方法创建spy对象 PowerMockito.doReturn(true).when(spy, "isValidPhone", "12345678901"); // 使用doReturn()方法模拟方法 assertTrue(spy.isValidUser()); } @Test public void testIsLegalAge() throws Exception { User user = new User(); User spy = PowerMockito.spy(user); // 使用spy()方法创建spy对象 PowerMockito.doReturn(false).when(spy, "isLegalAge", 15); // 使用doReturn()方法模拟方法 assertFalse(spy.isValidUser()); } } ``` 在以上代码中,我们使用spy()方法创建一个User类的spy对象,然后使用doReturn()方法模拟私有方法,并在测试方法调用公共方法isValidUser()来触发私有方法调用。 总结一下:PowerMockito提供了一种方便的方式来测试类中的私有方法。我们可以使用spy()方法来创建一个对象的spy对象,并使用doReturn()方法来模拟私有方法。这样我们就可以在不暴露私有方法的情况下,进行单元测试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值