返回

Mockito 中的类部分模拟:方法和选择

java

使用 Mockito 部分模拟类的方法

简介

在进行单元测试时,我们经常需要模拟对象来控制方法的行为和验证其调用。Mockito 是 Java 中一个流行的模拟框架,它允许我们轻松创建模拟对象。然而,在某些情况下,我们可能只想模拟类中的某些方法,同时让其他方法保持其原始行为。本文将介绍如何使用 Mockito 仅模拟类中部分方法。

方法一:使用 @InjectMocks 注解

@InjectMocks 注解允许我们注入需要部分模拟的类的实例。它使我们能够对特定方法进行存根处理,同时保留其他方法的原始实现。

@RunWith(MockitoJUnitRunner.class)
public class StockTest {
    @InjectMocks
    private Stock stock;
    
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void getValueTest() {
        when(stock.getPrice()).thenReturn(100.00);
        when(stock.getQuantity()).thenReturn(200);
        
        double value = stock.getValue();
        
        assertEquals("Stock value not correct", 100.00 * 200, value, .00001);
    }
}

方法二:使用 @Spy 注解

@Spy 注解与 @InjectMocks 类似,但它允许我们创建类的部分模拟。我们可以使用 @Spy 来创建类的实例,并仅存根需要模拟的方法。

@RunWith(MockitoJUnitRunner.class)
public class StockTest {
    @Spy
    private Stock stock;
    
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void getValueTest() {
        doReturn(100.00).when(stock).getPrice();
        doReturn(200).when(stock).getQuantity();
        
        double value = stock.getValue();
        
        assertEquals("Stock value not correct", 100.00 * 200, value, .00001);
    }
}

选择方法

这两种方法都可以实现对类中部分方法的模拟。根据具体测试需求,我们可以选择最合适的方法。

结论

部分模拟类的方法在单元测试中非常有用。它允许我们专注于特定方法的行为,同时保留其他方法的原始实现。Mockito 提供了两种灵活的方法来实现此目的:@InjectMocks 和 @Spy 注解。根据我们的具体需求,我们可以选择最适合我们的方法。

常见问题解答

  1. 为什么需要部分模拟类的方法?
    答:部分模拟允许我们专注于特定方法的行为,同时保留其他方法的原始实现。这在测试复杂的类时非常有用,其中我们只想修改特定的方法。

  2. @InjectMocks 和 @Spy 注解有什么区别?
    答:@InjectMocks 注入需要部分模拟的类的实例,而 @Spy 创建类的部分模拟。@Spy 允许我们更精确地控制存根的方法。

  3. 是否可以使用其他方法来部分模拟类的方法?
    答:是的,可以使用其他方法,例如手动创建模拟对象或使用 Mockito 的其他功能,例如 ArgumentMatchers 和 Verification。

  4. 部分模拟在单元测试中有什么好处?
    答:部分模拟提高了测试的隔离性,允许我们专注于特定方法的行为,减少了测试的复杂性。

  5. 部分模拟有哪些潜在的缺点?
    答:部分模拟可能会导致测试用例的脆弱性,因为如果原始方法的行为发生变化,测试用例可能会失败。