来自Spring Context的模拟豆

时间:2016-01-27 09:26:46

标签: spring unit-testing junit spring-boot

我希望创建测试使用Spring Context,使用模拟的Repository bean。我正在使用Spring Boot 1.3.2.BUILD-SNAPSHOT + JUnit + Mockito。

这是我的测试配置类:

@ComponentScan(basePackages = "myapp", excludeFilters =
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
        value = {
                OfferRepository.class
        }
)
)
@Configuration
public class TestEdge2EdgeConfiguration {

    @Bean
    public OfferRepository offerRepository() {
       return mock(OfferRepository.class);
    }

}

此配置的目的是从Spring Context中排除OfferRepository并对其进行模拟,感谢这一点,我将能够编写使用Spring Context与模拟数据库存储库的测试。

这是我的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {TestEdge2EdgeConfiguration.class})
@WebAppConfiguration
public class OfferActionsControllerTest {

    @Autowired
    private OfferRepository offerRepository;

    @Autowired
    private OfferActionsController offerActionsController;

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

    @Test
    public void saveOffer() {
        //given
        BDDMockito.given(offerRepository.save(any(Offer.class))).willReturn(new Offer());
        //when
        ResponseEntity<Offer> save = offerActionsController.save(new Offer());

        //then
        org.springframework.util.Assert.notNull(save);
    }
}

测试和测试配置目录是:

src/test/java/myapp 

我的应用程序配置和包含OfferRepository目录的包是:

src/main/java/myapp/

问题是Spring Boot没有从TestEdge2EdgeConfiguration.class加载我的配置,并且从未创建过关于OfferRepository的模拟。

请问,身体能帮助我吗?

2 个答案:

答案 0 :(得分:0)

这就是你应该这样做的(假设你正在为offerActionsController编写测试并注入offerRepository):

@Mock
private OfferRepository offerRepository;

@InjectMocks
private OfferActionsController offerActionsController;

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

您可以按如下方式编写测试方法:

@Test
public void saveOffer() {
    /* Given */
    Mockito.when(offerRepository.save(Mockito.any(Offer.class))).thenReturn(new Offer());

    //when
    ResponseEntity<Offer> save = offerActionsController.save(new Offer());

    //then
    org.springframework.util.Assert.notNull(save);
}

答案 1 :(得分:0)

使用Spingockito使用@ReplaceWithMock用模拟替换bean。如果您需要访问测试中的模拟bean,请不要忘记将@Autowired@ReplaceWithMock一起使用。