保存时测试返回 NULL

test returning NULL when saving

我有这个class:

@Repository
public interface EnfantRepository extends JpaRepository<Enfant, Long> {

..
}

和此服务:

@Transactional
@Service
@Slf4j
public class EnfantService implements IEnfantService {

    public Enfant save (Enfant enfant) {
        return enfantRepository.save(enfant);
    }
}

和这个测试:

@RunWith(MockitoJUnitRunner.class)
public class EnfantServiceTest {

    @Mock
    private EnfantRepository enfantRepository = mock(EnfantRepository.class);

    @InjectMocks
    private EnfantService enfantService;

    @Test
    public void testSave() {

        System.out.println(enfantService.save(Enfant.builder().build()));

        Assertions.assertThat
                (enfantService.save(Enfant.builder().build())).isNotNull();

    }
}

但保存后它 return 为空并且测试失败

EnfantServiceTest class 中,你嘲笑了 EnfantRepository class 并且没有为模拟 EnfantRepository class 中的方法提供的实现。因此,调用任何方法都会 return null.

这里有两种方式:

  1. 使用 Mockito 的“when”和“then”模拟的 classEnfantRepository 的保存方法存根。
@RunWith(MockitoJUnitRunner.class)
public class EnfantServiceTest {

   @Mock
   private EnfantRepository enfantRepository = mock(EnfantRepository.class);

   @InjectMocks
   private EnfantService enfantService;

   @Test
   public void testSave() {

       System.out.println(enfantService.save(Enfant.builder().build()));
       
       when(enfantRepository.save(any()).thenReturn(Long.of(1));

       Assertions.assertThat
               (enfantService.save(Enfant.builder().build())).isNotNull();

   }
}
But this wont be a good way of testing the repository code. Rather,
  1. 为您的测试环境使用像 H2 这样的内存数据库,在这种情况下无需模拟存储库 class。 在 运行 测试时,Spring 将启动 H2 数据库,然后它将连接到该数据库并从您的实体 class 创建表并对该数据库执行所有查询。这将确保您的代码端到端按预期工作。