Spring集成测试:在使用MockitoJUnitRunner时注入@Value

时间:2017-09-05 12:09:56

标签: java spring spring-boot mockito spring-test

以下示例正常。问题是我需要@InjectMocks注释。当我用SpringJUnit4ClassRunner.class替换MockitoJUnitRunner.class时,所有内容都会中断(bar = null而不是testValue)。

如何解决?

//@RunWith(MockitoJUnitRunner.class) // not work (
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
        "some.bar.value=testValue",
})
public class FooTest {

    @Value("${some.bar.value}")
    String bar;

    @Test
    public void testValueSetup() {
        assertEquals("testValue", bar);
    }

    @Configuration
    static class Config {

        @Bean
        public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
            return new PropertySourcesPlaceholderConfigurer();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

你应该能够使用ClassRule和Rule的这个组合来启用SpringRunner所具有的相同功能。

Tuple

然后像正常一样使用MockitoRunner。

此外,您可以随时直接使用 @ClassRule public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule(); @Rule public final SpringMethodRule springMethodRule = new SpringMethodRule(); 等模拟依赖项注释方法,而稍微更清晰可能会导致一些恼人的运行时问题,如果测试不简单,尤其是。如果是Mockito.mock

很好奇为什么你需要一个SpringBoot项目中的Mockito跑步者?您可以在需要时使用MockBeans来模拟Spring Bean。闻起来就像一个XY问题因为我从未使用过MockitoRunner。

答案 1 :(得分:2)

Mockito还提供了一条规则来克服无法使用MockitoJUnitRunner的情况,例如:

@Rule
public MockitoRule mockito = org.mockito.junit.MockitoJUnit.rule();

...或者您可以手动设置Mockito:

@Before 
public void setUp() {
    MockitoAnnotations.initMocks(this);
}