嵌套自动连线字段在JUNIT测试中为空

时间:2019-06-28 12:06:24

标签: java spring testing 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()));
    }
}

1 个答案:

答案 0 :(得分:1)

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

有几种解决方法:

  • 如果要像POJO一样对其进行测试,请在被测试的类上设置该字段。您可以在当前的实现中使用@InjectMocksReflectionTestUtils.setField,或将@Autowire移至构造函数或setter并在测试中使用该字段创建类。我投票赞成在构造函数上自动布线

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

这两种方法都有效,请选择更适合您的