Mockito允许设置模拟返回值

6

能否更改从模拟对象返回的值?下面是一个示例,说明了我想做什么。

public class MyClass{
  public void method(Mock obj){
    if(obj.getValue.equals("value"){
      obj.setValue("changedValue");
    }

    anotherObj.call(obj.getValue());
  }

所以上面的类非常简化。如果传入的值等于value,则会更改返回的值。
@Test
public void test(){
  Mock obj = mock(Mock.class);
  when(obj.getValue()).thenReturn("value");

  testClass.method(obj);

  verify(anotherObj, times(1)).call("changedValue");
}

测试旨在验证是否会调用anotherObj.call并使用更改后的值,但由于我们已将返回值模拟为“value”,因此这将失败。

是否可以使用模拟的returnValue创建测试?


调用 anotherObj 上的 verify 将意味着 anotherObj 也是一个模拟对象,但在您的示例中没有指定。请更新它以反映您的确切测试用例。 - Morfic
看起来唯一的方法就像下面所说的那样,不是模拟对象,而是实际创建一个实例。 - well_i
4个回答

4
这样够用吗?
    ObjectUnderTest objectUnderTest = new ObjectUnderTest();
    ObjectUnderTest spy2 = Mockito.spy(objectUnderTest);

    when(spy2.getValue()).thenAnswer(new Answer<String>() {

        @Override
        public String answer(InvocationOnMock invocation) throws Throwable {
            Object realAnswer = invocation.callRealMethod();
            if (realAnswer.equals("SOME VALUE")) {
                return "SOME OTHER VALUE";
            }else {
                return realAnswer;
            }
        }
    });

所以当真正的getValue返回某个值时,您可以将其替换为不同的值...

3
约翰坦是对的。如果obj不是一个复杂对象,你可以避免使用模拟对象并使用真实对象。
如果由于某些原因这不可行,Mockito允许定义一系列答案,例如:when(obj.getValue()).thenReturn("value").thenReturn("modifiedValue");,这可能是您正在寻找的内容。
虽然这可能有点过度,但为了确保一切都没问题,我也会verify(obj).setValue("changedValue");verify(obj, times(2)).getValue();

1
你的第一个代码片段可以更简单地写成 when(obj.getValue()).thenReturn("value","modifiedValue"); - 你可以向 thenReturn 提供任意数量的参数,只要它们都是适当的类型。第一个值在存根方法被调用时返回,然后是第二个值,以此类推。你提供的最后一个值将会重复返回,一旦所有其他值都已经被使用完。 - Dawood ibn Kareem

2

与其嘲笑obj,为什么不使用实际的实现呢?那么,setValuegetValue方法应该按照您所期望的方式工作。

尽管我明白这可能是不可能的,因为您提到的示例只是您实际问题的简化版本。


0

试试这个:

@Test
public void test(){
  Mock obj = mock(Mock.class);

  doCallRealMethod().when(obj).setValue(any(String.class));
  when(obj.getValue()).thenCallRealMethod();
  obj.setValue("value");

  testClass.method(obj);

  verify(anotherObj, times(1)).call("changedValue");
}

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