首页 > 解决方案 > 嵌套的自动装配字段在 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()));
    }
}

标签: javaspringtestingjunit

解决方案


您的测试类中没有任何弹簧上下文,这意味着您正在测试一个没有弹簧初始化的 POJO,因此不会发生自动装配并且该字段为空。

有几种方法可以解决它:

  • 如果您想像 POJO 一样对其进行测试,请在测试类上设置该字段。您可以在当前实现中使用 , 或将 移至@InjectMocks构造函数或设置器,并在测试中使用该字段创建类。我投票支持构造函数的自动装配ReflectionTestUtils.setField@Autowire

  • 如果您希望将其作为弹簧组件进行测试,请定义一个@TestConfiguration并在其中导入您的真实配置并覆盖您不想使用的 bean,或者使用完全不同的弹簧配置进行测试。

无论哪种方式都有效,请选择更适合您的方式


推荐阅读