java - 嵌套的 Autowiring 字段在 JUNIT 测试中保持为空

标签 java spring testing junit

我实现了一个工厂模式,想测试一下。除了这个工厂方法中的字段没有 Autowiring 。工厂类中的 @Autowired 属性似乎保持为空。 我不能使用@SpringBootTest 注解,因为那时会加载区 block 链配置文件

下面是服务工厂的代码,parserfactory在测试中被正确地 Autowiring 。问题在于 parserfactory 的 Autowiring 字段

@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()));
    }
}

最佳答案

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

有几种方法可以解决:

  • 如果你想像 POJO 一样测试它,在测试类上设置字段。您可以在当前实现中使用 @InjectMocksReflectionTestUtils.setField,或者将 @Autowire 移至构造函数或 setter 并在中创建类现场测试。我投票赞成在构造函数上 Autowiring

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

两种方式都行,选择更适合自己的一种

关于java - 嵌套的 Autowiring 字段在 JUNIT 测试中保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56806646/

相关文章:

java - 在 OATS Java(不是 javascript)中打开并最大化浏览器窗口

java - 生产代码中的 Spring SimpleMessageBroker

java - 如何找出阻止 FileAppender 正常滚动的原因

testing - Selenium 打开浏览器并设置焦点

java - 我们可以在自定义Thread类中 Autowiring 类实例吗?

java - 如何在Java中批量执行一组 'select count(*)'查询?

带有 H2 控制台的 spring-boot-legacy

android - 在 monkeyrunner 中可以同时使用鼠标和键盘吗?

ruby - Rspec 错误 : No route matches {:controller= >"user"}

java - 在Java中调用子类的方法