java - 从类型转换操作返回模拟,Mockito,Java

标签 java unit-testing junit mockito

我这里有这段代码,我正在尝试测试:

public class Something {
    public String doSomething(MyClass myClass) { 
        return Utils.getPresentationString(myClass)
    }
}

public class Utils{
    public static String getPresentationString(MyClass myClass) {
        if (myClass instanceof MySubClass) {
            MySubClass mySubClass = (MySubClass) myClass;
            return mySubClass.getMaskedPresentationString();
        } else {
            return myClass.getPresentationString();
        }
    }
}

因为 Utils 是静态的,所以我在测试 Something 类时以黑盒方式对其进行测试。

我试图让这行代码返回一个模拟:

MySubClass mySubClass = (MySubClass) myClass;

我能做到

doReturn(MY_MASKED_STRING).when(this.mySubClassMock).getMaskedPresentationString()

然后做

assertEquals(MY_MASKED_STRING, this.somethingUnderTest.doSomething(this.myClassMock))

我该如何做这样的工作

doReturn(this.mySubClassMock).when(this.myClassMock).<<cast to MySubClass.class>>

最佳答案

该行是强制转换,它无法返回不存在的内容。但是然后。

public static String getPresentationString(MyClass myClass) {
    if (myClass instanceof MySubClass) {

那只是进入该类的对象。

因此你只需要:

MySubClass subclassMock = mock(MySubClass.class);
...

objectUnderTest.getPresentationString(subclassMock);

然后您的生产代码应该很高兴地“它是一个 instanceof”,然后进行转换,让您完全控制传入的对象。

但请注意:此处“真正的”OOP 方式:避免使用 instanceof/cast!

return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()

为什么您的子类不覆盖 getPresentationString() 以返回其他值?如果那是错误的,是否有可能有一些“基本”抽象方法然后有两个实现?!

长话短说:

  • 直接的答案是:只需传入 mock(MyClass.class)mock(MySubClass.class) 的内容,具体取决于您打算使用的路径测试
  • 但更好:完全摆脱 instanceof/cast 部分。好的 OOP 的全部要点就是完全避免这样的代码!

关于java - 从类型转换操作返回模拟,Mockito,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57296914/

相关文章:

java - 标记语法错误,错误放置的结构

java - 模拟方法返回 null 而不是预期的

unit-testing - 我们是否应该在 TDD 期间删除那些太简单而无法破坏的测试

c# - 开始在现有代码库中进行自动化集成/单元测试

java - 由 : org. springframework.beans.factory.UnsatisfiedDependencyException 引起:创建名称为 'myAppDao' 的 bean 时出错:

java - 需要在单元测试中使用依赖注入(inject) - 我应该使用 junit 还是 testng?

java - 我是否需要为测试用例使用的 util 类编写测试用例

java - 使用 Eclipse 连接数据库 Oracle 11G () 的问题 :

java - 在 Java 类方法中嵌入 JavaScript 片段

使用 Jackson PTH 和 Spring Data MongoDB DBRef 的 Java 到 JSON 序列化生成额外的目标属性