使用 Mockito 模拟类的成员变量

2022-08-31 07:22:41

我是开发新手,特别是单元测试。我想我的要求很简单,但我渴望了解其他人对此的看法。

假设我有两个这样的类 -

public class First {

    Second second ;

    public First(){
        second = new Second();
    }

    public String doSecond(){
        return second.doSecond();
    }
}

class Second {

    public String doSecond(){
        return "Do Something";
    }
}

假设我正在编写单元测试来测试方法。但是,假设,我想像这样模拟类。我正在使用Mockito来做到这一点。First.doSecond()Second.doSecond()

public void testFirst(){
    Second sec = mock(Second.class);
    when(sec.doSecond()).thenReturn("Stubbed Second");

    First first = new First();
    assertEquals("Stubbed Second", first.doSecond());
}

我看到嘲笑没有生效,断言失败了。是没有办法模拟我要测试的类的成员变量。?


答案 1

您需要提供一种访问成员变量的方法,以便可以传入模拟(最常见的方法是 setter 方法或采用参数的构造函数)。

如果你的代码没有提供执行此操作的方法,则对于 TDD(测试驱动开发)来说,它被错误地分解了。


答案 2

如果您无法更改代码,则无法执行此操作。但我喜欢依赖注入,Mockito支持它:

public class First {    
    @Resource
    Second second;

    public First() {
        second = new Second();
    }

    public String doSecond() {
        return second.doSecond();
    }
}

您的测试:

@RunWith(MockitoJUnitRunner.class)
public class YourTest {
   @Mock
   Second second;

   @InjectMocks
   First first = new First();

   public void testFirst(){
      when(second.doSecond()).thenReturn("Stubbed Second");
      assertEquals("Stubbed Second", first.doSecond());
   }
}

这非常好,很容易。


推荐