我如何以编程方式自动装配不属于bean的字段?

时间:2018-02-12 11:10:53

标签: java spring unit-testing autowired

在我正在处理的Spring Boot应用程序中,我有一个未注释为bean(@Component)的类,但包含一个自动连接的字段:

public class One{
    @Autowired
    private Two x;

    public getX(){
        return x;
    }
}

在Spring应用程序的配置xml中,类One被标记为bean,这使得在运行应用程序时变量x被初始化。

现在我编写了一个似乎没有使用spring xml配置的测试。所以我试着手动完成:

@RunWith(SpringRunner.class)
public class Test{
    @Autowired
    One y;


    @Test
    public void checkOne(){
        System.out.println(y.getX()); //null
    }
}

如何让Spring注入正确的代码,以便在我的测试中x不为空?

3 个答案:

答案 0 :(得分:3)

告诉测试使用什么配置:

<form action="FileUploadServlet" method="post" target="_blank" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>

请参阅here了解文档

答案 1 :(得分:1)

Essex Boy的方法进行了一次&#34;集成测试&#34;因为它启动Spring进行测试。

通常对于单元测试,您想要模拟您的依赖项;那些可以&#34;自动装配&#34;。

@RunWith(MockitoJUnitRunner.class) // necessary for the annotations to work
public class YourTest {

    // this is a mock
    @Mock 
    private Two mockedTwo; 

    @InjectMocks
    // this is automatically created and injected with dependencies       
    private One sut;       

    @Test
    public void test() {
        assertNotNull(sut.getX());
        sut.doStuff();
        verify(mockedTwo).wasCalled();
    }
}

答案 2 :(得分:1)

Alernative to @Essex Boy方法: 在测试中使用自定义配置:

@RunWith(SpringRunner.class)
public class TestClass {

    @Configuration
    @ComponentScan
    static class ConfigurationClass {
        @Bean
        public One makeOne() {
            return new One();
        }
    }

    @Autowired
    One y;


    @Test
    public void checkOne(){
        System.out.println(y.getX()); 
    }
}