gpt4 book ai didi

spring - @InjectMocks 在 Autowiring 其余依赖项时不起作用

转载 作者:行者123 更新时间:2023-12-05 02:20:22 24 4
gpt4 key购买 nike

我正在尝试测试使用 2 个服务的 ClassA。一项服务需要 Autowiring ,而另一项服务则被视为模拟对象。不幸的是,模拟对象是

not injected

到我的测试类。所有字段的行为就像我只会使用 spring Autowiring 功能来设置它一样。测试的 ClassA 也继承自其他抽象类。如果不使用 Autowiring ,模拟对象将成功传递。不幸的是我不能 mock ServiceDao,这就是为什么我试图结合 @InjectMocks@Autowiring 注释。

A 级。

public ClassA extends AbstractClassA<ClassOne, ClassTwo>{

@Autowired
protected ServiceOne serviceOne; //this services needs to be mocked

@Override
protected List<ClassTwo> testedMethod(){
return serviceOne.getList(); //here method is not returning mocked objects
} //as it supposed to do.
........
}

抽象类

public class AbstractClassA<T1 extends InterfaceOne, T2 extends InterfaceTwo){
@Autowired
protected ServiceDAO serviceDAO; //this services needs to be autowired

protected abstract List<T2> testedMethod();

}

测试类。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"})
public class Test {
@Mock
private ServiceOne serviceOne; //this mock object and it's return
//objects are set properly


@Autowired
@InjectMocks
private ClassA classA; //all fields are autowired, including the services that should be mocked

@Before
public void setData(){
Mockito.Annotations.initMocks(this);
List<ClassTwo> result = Arrays.asList(new ClassA());
when(serviceOne.testedMethod().thenReturn(result); //here when i invoke mocked object it is returning correct list.
}
}

最佳答案

在这种情况下,最好通过 Spring 测试上下文配置来模拟注入(inject)的 bean。如果您无法轻松做到这一点,则可以使用 Springs ReflectionTestUtils 类来模拟服务中的各个对象。

在您的测试配置 XML 文件中,您可以定义一个模拟 bean:

<bean id="serviceOne" class="org.mockito.Mockito" factory-method="mock"/>
<constructor-arg value="com.package.ServiceOne"/>
</bean>

在 Java 端:

@Bean
public ServiceOne serviceOne() {
return mock(ServiceOne.class);
}

在您的测试用例中,您可以@Autowire ServiceOne serviceOne 并将其用作您的模拟对象:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"})
public class Test {
@Autowired
private ServiceOne serviceOne;

@Autowired
private ClassA classA;

@Before
public void setData(){
Mockito.Annotations.initMocks(this);
List<ClassTwo> result = Arrays.asList(new ClassA());
when(serviceOne.testedMethod()).thenReturn(result);
}
}

关于spring - @InjectMocks 在 Autowiring 其余依赖项时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39333922/

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