gpt4 book ai didi

java - 如何模拟注入(inject)模拟的对象的方法

转载 作者:行者123 更新时间:2023-12-02 04:16:55 25 4
gpt4 key购买 nike

我正在使用mockito和testng为一个类编写测试。要测试的类有几个需要模拟和注入(inject)的依赖项。要测试的类具有以下配置文件

class A{
@Autowired
private Object1;
@Autowired
private Object2;
Object3 methodToBeTested (){
//some code
method2();
//some code
}
boolean method2(){
//some calls to Database that are not operational
}
}

在我的测试类中,我将对象 Object1 和 Object2 声明为模拟对象并按如下方式初始化它们

@Mock
Object1 ob1;
@Mock
Object2 ob2;
@InjectMocks
A a = new A();

@Test
public void ATest(){
Object3 ob3;
when(ob1.someMethod()).thenReturn(someObject);
when(ob2.someMethos()).thenReturn(someOtherObject);
ob3 = a.methodToBeTested();
assertNotNull(ob3);
}

问题的出现是因为我必须模拟对 A 类的 method2 的调用,并且它有一些在测试阶段无法运行的调用。此外,mockito 不允许对象同时具有 @Mocks 和 @InjectMocks 注释。有没有一种方法可以在不修改 A 类代码的情况下继续进行测试(不想仅仅为了测试而修改它)。

最佳答案

您需要监视真实的 A 对象,如 the documentation 中所述。 :

@Mock
Object1 ob1;

@Mock
Object2 ob2;

@InjectMocks
A a = new A();

@Test
public void ATest(){
A spy = spy(a);

doReturn(true).when(spy).method2();

Object3 ob3;
when(ob1.someMethod()).thenReturn(someObject);
when(ob2.someMethos()).thenReturn(someOtherObject);

ob3 = spy.methodToBeTested();

assertNotNull(ob3);
}

请注意,这很有可能表明代码有异味。 method2() 也许应该移至 A 所依赖的另一个类中。

关于java - 如何模拟注入(inject)模拟的对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209536/

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