我有一个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;
有更好的方法吗?
答案 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
批注:
声明很简单:
@MockBean
private MyService myService;
Spring Boot将在此处注入Mockito模拟,而不是实际的bean。