当在JPARepository上进行间谍监视时,调用save方法返回null

时间:2019-02-06 10:53:02

标签: spring-boot junit mockito spring-boot-test

我正在编写一个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时,它返回的是空对象而不是实体。

有什么办法可以解决此问题?

1 个答案:

答案 0 :(得分:0)

代替上述构造,只需使用Spring Boot本机注释@SpyBean,您还需要自动装配测试类,在本例中为MyService

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class MyServiceTest {
    @SpyBean
    MyRepository myRepository;

    @Autowired
    OtherService otherService

    public void testMyMethod() {
        myService.myMethod();
    }
}