Spring MVC控制器单元测试:如何设置私有实例布尔字段?

时间:2017-06-13 09:35:43

标签: java unit-testing spring-mvc spring-restcontroller

我有一个Spring MVC REST控制器类,它有一个通过@Value注入的私有实例布尔字段,

@Value("${...property_name..}")
private boolean isFileIndex;

现在要对这个控制器类进行单元测试,我需要注入这个布尔值。

如何使用MockMvc

执行此操作

我可以使用反射,但是MockMvc实例并没有给我底层控制器实例传递给Field.setBoolean()方法。

测试类在不模拟或注入此依赖项的情况下运行,其值始终为false。我需要将其设置为true以涵盖所有路径。

设置如下所示。

@RunWith(SpringRunner.class)
@WebMvcTest(value=Controller.class,secure=false)
public class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;
 ....
}

2 个答案:

答案 0 :(得分:2)

您可以使用@TestPropertySource

@TestPropertySource(properties = {
    "...property_name..=testValue",
})
@RunWith(SpringRunner.class)
@WebMvcTest(value=Controller.class,secure=false)
public class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;

}

您还可以从文件中加载测试属性

@TestPropertySource(locations = "classpath:test.properties")

编辑:其他一些可能的选择

@RunWith(SpringRunner.class)
@WebMvcTest(value=Controller.class,secure=false)
public class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired 
    private Controller controllerUnderTheTest;


    @Test
    public void test(){
        ReflectionTestUtils.setField(controllerUnderTheTest, "isFileIndex", Boolean.TRUE);

        //..
    }

}

答案 1 :(得分:0)

我首选的选项是在构造函数中设置它并使用@Value注释构造函数参数。然后,您可以在测试中传入任何您想要的内容。

请参阅this answer