【问题标题】:How to mock local variable obtained from another method of tested class?如何模拟从测试类的另一种方法获得的局部变量?
【发布时间】:2014-04-18 11:57:03
【问题描述】:

我有以下课程

class MyClass{
   public void m(InputStream is){
       ...
       Parser eParser = getExcelFileParser();
       eParser.parse(is);
       ...
       eParser.foo();
       eParser.bar();

   }
   public ExcelFileParser getExcelFileParser(){
       ...
   } 
}

在这种情况下如何为方法m编写单元测试?我只想模拟 eParser 对象。

有可能吗?

我使用 Mockito 和 PowerMockito

【问题讨论】:

    标签: java testing mocking mockito powermock


    【解决方案1】:

    您可以使用 spy 在 Mockito 中做您想做的事(无需 PowerMock),而无需更改您的代码。

    在您的单元测试中,您需要执行以下操作:

    ExcelFileParser parser = mock(ExcelFileParser.class);
    MyClass myClass = spy(new MyClass());
    doReturn(parser).when(myClass).getExcelFileParser();
    

    【讨论】:

    • 是的!间谍只替换你告诉它的方法
    【解决方案2】:

    你可以将AnotherObject作为参数传递给方法m,而不是在方法本身中调用getAnotherObject()吗?

    【讨论】:

    • 然后使用Mockito来模拟getAnotherObject,例如when(myClass.getAnotherObject()).thenReturn(myNewMockObject)
    【解决方案3】:

    前言:我使用的是 EasyMock 而不是 Mockito,所以这可能有点不对劲。

    你不能在你的测试中创建一个 MyClass 的内部子类来覆盖 getExcelFileParser 并让它返回一个模拟吗?像这样:

    public class MyClassMock extends MyClass {
    
         ExcelFileParser _mock;
    
         public MyClassMock(ExcelFileParser mock) {
              _mock = mock;
         }
    
         @Override
         public ExcelFileParser getExcelFileParser() {
             return _mock;
         }
    }
    

    我没有对此进行测试,因此可能存在问题,但基本想法应该是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2014-06-07
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多