PowerMockito测试私有方法以及捕获自定义异常

在写unit test时,难免会遇到测试私有方法的时候,下面是用PowerMockito测试私有方法的一种方式。

Method method = PowerMockito.method(类名.class, "方法名", 参数1类型.class, 参数2类型.class, ...)

method.invoke(类实例, 参数1, 参数2, ...)

参数X类型.class举例:Date.class

另外,在测试方法中抛出的自定义异常的message时,由于method.invoke不会抛出我们自定义的异常类型,所以我们得用catch Exception的方式而不是catch customException,并且在获取message上方式上有一点点不同(原来是e.getMessage)

try {
      Method method = PowerMockito.method(类名.class, "方法名", 参数1类型.class, 参数2类型.class, ...)
      method.invoke(类实例, 参数1, 参数2, ...)
} catch(Exception e) {
      String msg = e.getCause().getMessage();
}

另外,贴一个我同事写的关于写unit test的文章: https://blog.csdn.net/u014388161/article/details/100662578

刚看到一个和我几乎重复内容的博客(都可以看看的):https://blog.csdn.net/u012760435/article/details/91387408

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值