当监视调用 JPARepository 时,保存方法返回 null



我正在编写一个 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();
    }
}

相关内容

  • 没有找到相关文章

最新更新