【问题标题】:Mockito define behavior of mock when it is type castMockito 在类型转换时定义模拟的行为
【发布时间】:2015-11-10 03:42:50
【问题描述】:

在 Mockito 中,是否可以在类型转换的情况下定义模拟对象的行为,也许可以使用 Mockito 的“when ... thenReturn”功能来定义模拟对象的行为调用它的方法的事件?

例如,在下面的示例类和测试中...

public class MyClass {
  public String myMethod(ObjectString arg) {
    ans = (String) arg;
    return ans;
  } 
}

public class MyClassTest {
  @Test
  public void myMethod_should_convert_to_string() {
    MyClass testMyClass = new MyClass();
    ObjectString mockObjectString = Mockito.mock(ObjectString.class);
    String expected = "expected string returned";
    Mockito.when(mockObjectString.IS_CAST_TO_STRING).thenReturn(expected);
    String actual = testMyClass.myMethod(mockObjectString);
    Assert.assertEquals(expected, actual);
  }
}

...有什么我可以替换 'IS_CAST_TO_STRING' 的东西会导致 mockObjectString 被强制转换为“预期的字符串返回”的特定值?

【问题讨论】:

  • no.... 这将违反 Java 语言的基本语义。这就像问你是否可以将1+1 模拟为0
  • Java 中没有任何东西可以让您更改发生强制转换时发生的情况;不是 Mockito,不是任何东西。
  • SuperPowerMock 会让你... jk
  • 等等,你真的要替换toString(),想验证String x = myObj + " foo"; 是否有效吗?这可能看起来就像是被强制转换为字符串,但实际上是在调用toString()。嘲笑只是Mockito.doReturn("expected").when(mock).toString();
  • 您可能要问的另一件事是,如果您将 Child 强制转换为 Parent,您如何验证 Parent 的方法是否被调用。而你不能;这不是面向对象在 Java 中的工作方式。您也不能以这种方式测试动态调度,因为 Java 方法调用是静态“链接”的。

标签: java unit-testing junit mockito


【解决方案1】:

ObjectString 的实例永远不能转换为 StringString 不继承自任何名为 ObjectString 的类,也不实现任何名为 ObjectString 的接口。投射到String总是抛出ClassCastException,除非argnull

另一方面,如果你的测试类看起来像这样:

public class MyClass {
    public String myMethod(final Object arg) {
        final String ans = (String) arg;
        return ans;
    }
}

然后,您可以实现您正在寻找的没有 Mockito:

@Test
public void myMethod_should_convert_to_string() {
    MyClass testMyClass = new MyClass();
    String expected = "expected string returned";
    String actual = testMyClass.myMethod(expected);
    assertEquals(expected, actual);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多