我正在编写一个 SpringBoot 集成测试,我需要能够模拟与外部服务的交互,同时使用一些真实对象(如扩展 JPARepository 的接口(来与我的数据库接口。
假设我测试的班级如下:
@Service
class MyService {
@Autowired
MyRepository myRepository; // This is the JPARepository which I want to use the real thing
@Autowired
OtherService otherService; // This one I really want to mock
public class myMethod() {
//Code which composes anEntity
//anEntity is not null
MyEntity myEntity = myRepository.save(anEntity); //after save myEntity is null
myEntity.getId(); // this will throw an NPE
}
}
现在这是我的测试课,
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class MyServiceTest {
@InjectMocks
MyService service;
@Spy
@Autowired
MyRepository myRepository;
@Mock
OtherService otherService
public void testMyMethod() {
myService.myMethod();
}
}
基本上注入模拟和间谍似乎一切正常,但由于某种原因,当我在 MyRepository 上调用 save 时,它会返回一个空对象而不是实体。
有什么方法可以解决此问题吗?
而不是上面的构造,只需使用 Spring Boot 本机注释@SpyBean
Yo u还需要自动连线测试类,在这种情况下MyService
。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class MyServiceTest {
@SpyBean
MyRepository myRepository;
@Autowired
OtherService otherService
public void testMyMethod() {
myService.myMethod();
}
}