如何在Spring Boot中用测试模型替换Bean以进行集成测试

时间:2019-01-05 11:23:12

标签: spring spring-boot

我有一个spring应用,并且对此应用进行了集成测试。我想用模拟豆代替豆。

我的真实豆看起来像这样

@Service
public class MyService {

}

为了进行测试,我希望将其替换

@Service
public class TestMyService {

}

我能想到的就是对不同的服务使用配置文件。例如:

@Service
@Profile("!test")
public class MyService implements IMyService {

}

@Service
@Profile("test")
public class TestMyService implements IMyService {

}

然后我像这样自动装配bean

@Autowired
private IMyService myService;

有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

我个人的喜好是避免加载竞争环境进行测试。因此,我希望我的测试专注于豆子集。通常,这意味着我概述了我在测试中使用的bean:

@RunWith(SpringRunner.class)
@SpringBootTest(
        classes = {TestMyService.class, OtherClassNeededForTesting.class}
)
public class DelaysProviderTest {

}

如果需要更多配置,我倾向于准备单独的配置类以进行测试:

@RunWith(SpringRunner.class)
@SpringBootTest(
        classes = MyTest.Cfg.class
)
public class MyTest {

    @Import({
        // .. some classes to import including TestMyService.class
    })
    @Configuration
    public static class Cfg {

    }

}

当需要更多配置(或模拟)时,我使用测试配置来提供适当的模拟

@RunWith(SpringRunner.class)
@SpringBootTest(
        classes = MyTest.Cfg.class
)
public class MyTest {

    @Import({
        // .. some classes to import
    })
    @Configuration
    public static class Cfg {

        @Bean
        public IMyService service() {
            IMyService mock = Mockito.mock(IMyService.class);
            when(mock.someMethod()).thenReturn("some data");

            return mock;
        }

    }

}

答案 1 :(得分:0)

您可以为自己的豆命名,例如

@Service("testService")    
public class TestMyService implements IMyService {

}

在测试类中,您可以使用@Qualifier明确要求测试服务,例如

@Qualifier("testService")
@Autowired
private IMyService myService;

答案 2 :(得分:0)

Spring Boot专门为此目的提供了@MockBean@SpyBean批注:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-mocking-beans

声明很简单:

@MockBean
private MyService myService;

Spring Boot将在此处注入Mockito模拟,而不是实际的bean。