使用Mockito模拟“内部”对象

6

我对单元测试和mockito不太熟悉,我有一个需要测试的方法,其中调用了一个新对象的方法。 如何模拟内部对象?

methodToTest(input){
...
OtherObject oo = new OtherObject();
...
myresult = dosomething_with_input;
...
return myresult + oo.methodX();
}

我能模拟面向对象以返回“abc”吗? 我真的只想测试我的代码,但是当我模拟“methodToTest”返回“42abc”时,我将无法测试我的“dosomething_with_input”代码...


你是在询问 https://code.google.com/p/mockito/wiki/MockingObjectCreation 上已经回答的问题,还是我误解了你的意思? - Dawood ibn Kareem
你说得对,回答了我的问题,我已经预料到了。但是我希望找到一种不需要对象创建方法的方式,因为我不想改变代码,只是为了能够进行单元测试... - RRZ Europe
1个回答

5

我认为实现methodToTest方法的类被命名为ClassToTest

  • 创建OtherObject的工厂类
  • 将该工厂作为ClassToTest的一个字段
  • 要么
    • 将工厂作为ClassToTest构造函数的参数传递
    • 或在分配ClassToTest对象时初始化它,并为工厂创建一个setter方法

你的测试类应该是这个样子的

public class ClassToTestTest{
    @Test
    public void test(){
        // Given
        OtherObject mockOtherObject = mock(OtherObject.class);
        when(mockOtherObject.methodX()).thenReturn("methodXResult");
        OtherObjectFactory otherObjectFactory = mock(OtherObjectFactory.class);
        when(otherObjectFactory.newInstance()).thenReturn(mockOtherObject);
        ClassToTest classToTest = new ClassToTest(factory);

        // When
        classToTest.methodToTest(input);

        // Then
        // ...
    }
}

1
这可能是实现此操作的最佳方法。然而,作为一个FYI,PowerMock确实允许模拟构造函数调用。再次强烈建议使用上面的方法而不是PowerMock。 - John B
4
唯一的“问题”是我必须重构代码以符合这个模式来进行测试。 - RRZ Europe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接