【问题标题】:Nested autowired field stays null in JUNIT test嵌套的自动装配字段在 JUNIT 测试中保持为空
【发布时间】:2019-06-28 12:06:24
【问题描述】:

我实现了一个工厂模式并想对此进行测试。除了这个工厂方法中的字段没有自动装配。似乎工厂类中的 @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()));
    }
}

【问题讨论】:

    标签: java spring testing junit


    【解决方案1】:

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

    有几种方法可以解决:

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

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

    两种方法都行,选择更适合你的一种

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2018-03-07
      • 2015-02-19
      相关资源
      最近更新 更多