我正在编写一个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时,它返回的是空对象而不是实体。
有什么办法可以解决此问题?
答案 0 :(得分:0)
代替上述构造,只需使用Spring Boot本机注释@SpyBean
,您还需要自动装配测试类,在本例中为MyService
。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class MyServiceTest {
@SpyBean
MyRepository myRepository;
@Autowired
OtherService otherService
public void testMyMethod() {
myService.myMethod();
}
}