gpt4 book ai didi

java - Mockito 无法模拟目标类构造函数中存在的函数调用

转载 作者:行者123 更新时间:2023-11-30 06:21:14 27 4
gpt4 key购买 nike

我正在尝试使用 Mockito 和 JUnit 测试以下类:

public class A {
private SomeClass someObject;
private SomeImpClass someImpObject1;
private SomeImpClass2 someImpObject2;

public A(SomeImpClass someImpObject1, SomeImpClass2 someImpObject2){
someObject = makeNewObject(someImpObject1, someImpObject2);
}

public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return new SomeObject(someImpObject1,someImpObject2);
}

public usingSomeObject(){
someObject.doSomething();
}
}

所以,我使用 Mockito 和 JUnit 编写了一个单元测试:

@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
SomeImpClass1 someImpObject1;

@Mock
SomeImpClass2 someImpObject2;

@Mock
SomeObject someObject;

@Spy
A a;

@Before
public void setUp() {
when(A.makeNewObject).thenReturn(someObject);
this.A = new A(this.someImpObject1, someImpObject2);
when(someObject.doSomething).thenReturn(something);
}
}

我在这里面临的问题是,虽然我已经对函数 makeNewObject 进行了 stub 以返回 SomeClass 的模拟对象,但代码流仍然在函数(makeNewObject)内部进行并给出 null 异常。

我做错了什么?我为此浪费了一天的时间。

使用 Mockito 不太流畅。

最佳答案

通过监视和 stub ,您将无法实现您的目标。这是因为您的目标是 stub 构造函数中使用的方法..但是一旦创建了具体对象并监视它就无法开始 stub ..无法完成..

我建议在测试类中创建一个私有(private)类,该类扩展了被测类,覆盖构造函数中调用的方法,然后在测试中使用它:

@RunWith(MockitoJUnitRunner.class)
public class ATest {

@Mock
SomeObject someObjectMock;

A a;

@Before
public void setUp() {
this.a = new MyTest();
}

private class MyTest extends ATest{

@Override
public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return someObjectMock;
}

}

现在您也不需要对其进行监视和 stub ,因为重写方法始终返回您在测试中期望的内容。

关于java - Mockito 无法模拟目标类构造函数中存在的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48109371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com