Java 模拟子类对象和超类引用

Java 模拟子类对象和超类引用,java,unit-testing,mockito,powermockito,Java,Unit Testing,Mockito,Powermockito,这是一个场景,我的一个cls方法中有类似的内容: public class xyz{ public Object build(Map map) { BaseClass cls; if(SomeconditionTrue) { cls = new ChildClass1(new ABC()); } else { cls = new ChildClass2(new ABC()); }

这是一个场景,我的一个cls方法中有类似的内容:

public class xyz{
    public Object build(Map map) {

       BaseClass cls;

       if(SomeconditionTrue) {
         cls = new ChildClass1(new ABC());
       } else {
         cls = new ChildClass2(new ABC());
       }

       cls.callMethod();
    }
}

对于上面的场景,我正在使用PowerMockito编写一个测试用例,我想模拟这个方法调用,
cls.callMethod()
。当我尝试正常的模拟时,它调用失败的实际方法
callMethod()
。有人能帮我模拟一下那个方法调用吗?尝试使用PowerMockito.stub和一些其他选项使用两种场景,但它总是调用实际的方法。

使用Powermock可以执行以下操作:

PowerMockito.whenNew(ChildClass1.class) .withArguments(any(ABC.class)) .thenReturn(mockedBaseClass); PowerMockito.whenNew(ChildClass2.class) .withArguments(any(ABC.class)) .thenReturn(mockedBaseClass); PowerMockito.whenNew(ChildClass1.class) .带参数(任何(ABC.class)) .然后返回(模拟基类); PowerMockito.whenNew(ChildClass2.class) .带参数(任何(ABC.class)) .然后返回(模拟基类);
当然,我的首选方法是进入一个知道如何生成这些子类实例的工厂,然后您可以使用Mockito对其进行模拟,这样会更干净。但是,如果这不是一个选项,那么希望上面的方法能够起作用。

使用Powermock,您可以执行以下操作:

PowerMockito.whenNew(ChildClass1.class) .withArguments(any(ABC.class)) .thenReturn(mockedBaseClass); PowerMockito.whenNew(ChildClass2.class) .withArguments(any(ABC.class)) .thenReturn(mockedBaseClass); PowerMockito.whenNew(ChildClass1.class) .带参数(任何(ABC.class)) .然后返回(模拟基类); PowerMockito.whenNew(ChildClass2.class) .带参数(任何(ABC.class)) .然后返回(模拟基类);
当然,我的首选方法是进入一个知道如何生成这些子类实例的工厂,然后您可以使用Mockito对其进行模拟,这样会更干净。但是,如果这不是一种选择,希望上述方法能够奏效。

感谢您的回复。我正在尝试上述方法,当我使用withArguments(any)时,我可以看到编译错误(感谢您的回复。我正在尝试上述方法,当我使用withArguments(any(ABC.class))时,我可以看到编译错误),表示未定义的方法any。我已经导入了所有包import org.powermock.api.mockito.*;我是否遗漏了什么?哦,对不起。因此,您需要静态导入“import static org.mockito.mockito.any;”。或者您可以使用mockito.any()同样。感谢您的回复。我正在尝试上述方法,当我使用withArguments(any)时,我可以看到编译错误(感谢您的回复。我正在尝试上述方法,当我使用withArguments(any(ABC.class))时,我可以看到编译错误),表示未定义的方法any。我已经导入了所有包import org.powermock.api.mockito.*;我是否遗漏了什么?哦,对不起。因此,您需要静态导入“import static org.mockito.mockito.any;”。或者您也可以使用mockito.any()。