使用mock对象一个举例

 package cn.com.rzx.test;
public class A
{
 private BInterfance bInterfance;
 public A(BInterfance bInterfance)
 {
  this.bInterfance = bInterfance;
 }
 public String testMethod(String str)
 {

  return str + bInterfance.getString("b");
 }
}

package cn.com.rzx.test;
public class B implements BInterfance
{
 public String getString(String str){
  return str+"77777777";
 }
}

package cn.com.rzx.test;
public interface BInterfance
{
 public String getString(String str);
}

package cn.com.rzx.test;
public class MockB implements BInterfance
{
 private String str;
 public String getString(String str){
  return str;
 } 
 public void setString(String str){
  this.str = str;
 }
}

package cn.com.rzx.test;
import junit.framework.TestCase;
public class ATest extends TestCase
{
 protected BInterfance mock;
 protected A a;
 protected void setUp() throws Exception
 {
  super.setUp();
  mock = new MockB();
  a = new A(mock);  
 }

 /*
  * “cn.com.rzx.test.A.testMethod(String)”的测试方法
  */
 public void testTestMethod()
 {
  assertEquals(a.testMethod("a"), "ab");
 }

}

<think>好的,我现在需要回答用户关于Mockito中mock方法处理new对象操作的问题。首先,我得回想一下Mockito的基本用法,特别是关于模拟对象创建的部分。 用户提到的是在Mockito中使用mock方法时,涉及到new创建对象的情况。Mockito本身主要是通过mock方法来创建模拟对象,但如果在被测试的代码中直接使用了new来实例化对象,这可能会导致问题,因为Mockito默认无法拦截new操作。 这时候,我需要考虑PowerMockito,因为它是扩展了Mockito,能够处理静态方法、构造函数等。例如,当被测试的类中使用new创建了一个依赖对象,为了隔离测试,可能需要用PowerMockito来模拟这个构造函数,从而返回一个mock对象。 接下来,我需要整理步骤,比如添加PowerMock依赖,使用@PrepareForTest注解,以及使用whenNew方法来模拟构造函数。同时,要注意JUnit测试运行器的设置,使用PowerMockRunner。 可能还需要举例说明,比如一个MyService类在方法中new了一个MyDependency,这时候如何通过PowerMockito来模拟这个MyDependency的实例,确保测试不依赖于真实的对象。 另外,需要提醒用户Mockito和PowerMockito的版本兼容性问题,以及现代Mockito版本是否有其他替代方案,比如使用依赖注入来避免直接new对象,这样更容易测试。 最后,确保回答结构清晰,分点说明,并提供代码示例,帮助用户理解如何具体实现。同时,强调在可能的情况下,优先使用Mockito和良好的设计模式,减少对PowerMock的依赖,以保持测试的简洁性。</think>在 Mockito 中直接使用 `new` 创建对象会破坏测试隔离性,以下是解决方案和最佳实践: 1. **问题本质** 当被测试代码中存在 `new SomeDependency()` 时: ```java public class OrderService { public void createOrder() { // 直接new会创建真实对象 PaymentGateway gateway = new PaymentGateway(); gateway.process(...); } } ``` 2. **解决方案:PowerMockito** 使用 PowerMock 拦截构造函数调用: **步骤 1** 添加依赖(Maven): ```xml <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> ``` **步骤 2** 测试类配置: ```java @RunWith(PowerMockRunner.class) @PrepareForTest(OrderService.class) // 指定要修改的类 public class OrderServiceTest { @Test public void testCreateOrder() throws Exception { // 模拟依赖对象 PaymentGateway mockGateway = Mockito.mock(PaymentGateway.class); // 拦截构造函数 PowerMockito.whenNew(PaymentGateway.class) .withNoArguments() .thenReturn(mockGateway); // 执行测试 new OrderService().createOrder(); // 验证调用 verify(mockGateway).process(any()); } } ``` 3. **现代推荐方案** 更推荐使用依赖注入模式: ```java public class OrderService { private final PaymentGateway gateway; // 通过构造函数注入 public OrderService(PaymentGateway gateway) { this.gateway = gateway; } public void createOrder() { gateway.process(...); } } // 测试时直接注入mock对象 @Test public void testWithDI() { PaymentGateway mock = mock(PaymentGateway.class); OrderService service = new OrderService(mock); service.createOrder(); verify(mock).process(any()); } ``` 4. **重要注意事项** - 优先使用依赖注入模式 - 尽量避免使用 `PowerMock`(会增加测试复杂度) - 如果必须使用 `new`,考虑使用工厂模式封装对象创建 - Mockito 3.4+ 支持内联 mock maker,可部分替代 PowerMock: ```java try (MockedConstruction<PaymentGateway> mockConstruction = mockConstruction(PaymentGateway.class)) { // 在此代码块内new的对象都会被mock PaymentGateway gateway = new PaymentGateway(); assertTrue(mockConstruction.constructed().contains(gateway)); } ``` 结论:推荐通过良好的代码设计(依赖注入)来避免直接 `new` 依赖对象,这样可以直接使用Mockito 进行测试,保持测试的简洁性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值