有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JUNIT测试中java嵌套的自动连接字段保持为空

我已经实现了一个工厂模式,并想测试它。除了此工厂方法中的字段没有自动连线之外。工厂类中的@Autowired属性似乎保持为空我无法使用@SpringBootTest注释,因为当时加载的区块链配置文件

下面是服务工厂的代码,parserfactory在测试中自动连接正确。问题在于parserfactory的自动连接字段

@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) 个答案

  1. # 1 楼答案

    测试类中没有任何spring上下文,这意味着测试POJO时没有对其进行spring初始化,因此不会发生自动连接,字段为空

    有几种方法可以解决这个问题:

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

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

    无论哪种方法都有效,选择一种更适合你的方法