java - 嵌套的自动装配字段在 JUNIT 测试中保持为空
问题描述
我实现了一个工厂模式并想对此进行测试。除了这个工厂方法中的字段没有自动装配。似乎工厂类中的 @Autowired 属性保持为空。由于随后加载了区块链配置文件,我无法使用 @SpringBootTest 注释
下面是服务工厂的代码,解析器工厂在测试中被正确地自动装配。问题在于解析器工厂的自动装配字段
@Service
@Slf4j
public class ParserFactory {
@Autowired
OsirisParser osirisParser;
public Parser getParser(String system) {
if (system == null) {
return null;
}
if (system.equalsIgnoreCase("Progress")) {
return ProgressCreateService();
}
if (system.equalsIgnoreCase("Osiris")) {
log.debug("Osiris parsen creëren");
return OsirisCreateService();
}
return null;
}
public OsirisParser OsirisCreateService() {
return osirisParser;
}
public OsirisParser ProgressCreateService() {
return new OsirisParser("ProgressParser");
}
考试
@RunWith(SpringRunner.class)
public class FactoryTest {
@Mock
ParserFactory serviceCallFactory;
@Test
public void testCreateOsirisServiceSuccesFull() {
Parser serv = serviceCallFactory.getParser("Osiris");
assertThat(serv, instanceOf(OsirisParser.class));
}
@Test
public void testCreateProgressServiceSuccesFull() {
Parser serv = serviceCallFactory.getParser("Progress");
assertThat(serv, instanceOf(ProgressParser.class));
}
@Test
public void testCreateProgressServiceUnSuccessFull() {
Parser serv = serviceCallFactory.getParser("Progrddess");
assertThat(serv, is(not(instanceOf(OsirisParser.class))));
}
@Test
public void testCreateWhenStringIsNotCorrect() {
Parser serv = serviceCallFactory.getParser("0$iri$");
assertThat(serv, is(nullValue()));
}
@Test
public void testCreateWhenStringIsNull() {
Parser serv = serviceCallFactory.getParser("");
assertThat(serv, is(nullValue()));
}
}
解决方案
您的测试类中没有任何弹簧上下文,这意味着您正在测试一个没有弹簧初始化的 POJO,因此不会发生自动装配并且该字段为空。
有几种方法可以解决它:
如果您想像 POJO 一样对其进行测试,请在测试类上设置该字段。您可以在当前实现中使用 , 或将 移至
@InjectMocks
构造函数或设置器,并在测试中使用该字段创建类。我投票支持构造函数的自动装配ReflectionTestUtils.setField
@Autowire
如果您希望将其作为弹簧组件进行测试,请定义一个
@TestConfiguration
并在其中导入您的真实配置并覆盖您不想使用的 bean,或者使用完全不同的弹簧配置进行测试。
无论哪种方式都有效,请选择更适合您的方式
推荐阅读
- java - 如何使用 KeyCloak 对 Java 应用程序进行身份验证和授权
- latex - 当只包含 Minion Pro Font 的一些工作时,其余的不会
- javascript - 如何更新图像,如果用户不上传,则保持图像相同,如果上传则更新
- php - 如何使用此嵌套数组以 HTML 格式输出所有航班?
- angular - 如何在两个内部 Angular 应用程序之间进行路由?
- javascript - 如何使用 axios 发布图片?
- binary-heap - 为什么这段代码是正确的,而它显然应该陷入无限循环?
- upload - 将我自己大小的图片上传到 vimeo
- lotus-domino - 数据库搜索 - 多个条件
- html - 如何在 Angular 打字稿中而不是在表单中执行字段验证?