Java @Mock jpaRepository调用real save方法,而@MockBean调用Mock方法

Java @Mock jpaRepository调用real save方法,而@MockBean调用Mock方法,java,unit-testing,spring-boot,mockito,junit4,Java,Unit Testing,Spring Boot,Mockito,Junit4,我认为我理解@Mock和@MockBean之间的区别,即使我认为任何被模拟的对象都不会调用真正的方法,尽管当我在测试下面运行时,我可以看到basket已经插入到hsqldb日志中。所以现在我对为什么在使用@Mock时插入basket而在使用@MockBean时不插入basket感到有点困惑 另一方面,如果我这样做,那么hsqldb是干净的。在这两种情况下,测试都是成功的 @MockBean private BasketRepository basketRepo; 测试班 服务 @MockBea

我认为我理解@Mock和@MockBean之间的区别,即使我认为任何被模拟的对象都不会调用真正的方法,尽管当我在测试下面运行时,我可以看到basket已经插入到hsqldb日志中。所以现在我对为什么在使用@Mock时插入basket而在使用@MockBean时不插入basket感到有点困惑

另一方面,如果我这样做,那么hsqldb是干净的。在这两种情况下,测试都是成功的

@MockBean
private BasketRepository basketRepo;
测试班

服务

@MockBean是一个Spring注释,应该在集成测试中使用,以便用模拟的bean替换真实的bean:

可用于向弹簧添加模拟的注释 应用程序上下文

Mockitos@Mock创建该存储库的模拟,但不将其注入BasketService

如果确实需要使用Mockitos mocked版本,则必须在测试中手动执行:

@Mock
private BasketRepository basketRepo;

@Test
public void createBasketWithSameOrderRef() throws Exception
{
   basketService.setBasketRepository(basketRepo);
   ...

我写了一篇关于你是否需要进一步阅读的文章。

啊,我明白了!顺便说一句,我注释掉了前2个——关联到basketRepo——我得到了相同的结果,basket被插入。因此,平均测试使用@Autowired basketRepo而不是模拟的。谢谢
@RunWith( SpringRunner.class )
@SpringBootTest( )
@ActiveProfiles( "test" )
public class BasketServiceTests
{

@SpyBean
private BasketService basketService;

@Mock
private BasketRepository basketRepo;

@Autowired
private UserAccountRepository userAccountRepo;

@Test
public void createBasketWithSameOrderRef() throws Exception
{
    UserAccount customer = userAccountRepo.findById( 1 )
            .orElseThrow( () -> new NotFoundException( "Customer not found" ) );

    Basket basket = new Basket();
    basket.setAudit( new Audit() );
    basket.setOrderRef( "ABCDEFGHIJ" );
    basket.setStatus( BasketStatusEnum.ACTIVE );
    basket.setUserAccount( customer );

    when( basketRepo.existsByOrderRef( anyString() ) ).thenReturn( false );
    when( basketRepo.save( isA( Basket.class ) ) ).thenReturn( basket );
    when( basketService.createOrderReference( ) ).thenReturn( "ABCDEFGHIJ" );

    Assert.notNull( basketService.getOrCreateByUserAccountBasket( customer ), "Basket id is null" );

}
}
@Service
public class BasketService 
{
@Autowired
private BasketRepository basketRepo;

public Basket getOrCreateByUserAccountBasket( @NotNull final UserAccount userAccount )
{
    Optional<Basket> optBasket = basketRepo.findByUserAccountAndStatusActive( userAccount );

    if ( optBasket.isPresent() )
    {
        return optBasket.get();
    }

    String orderRef = null;

    do
    {
        orderRef = createOrderReference();
    }
    while( basketRepo.existsByOrderRef( orderRef ) );

    Basket basket = new Basket();
    basket.setAudit( new Audit() );
    basket.setOrderRef( orderRef );
    basket.setStatus( BasketStatusEnum.ACTIVE );
    basket.setUserAccount( userAccount );

    return basketRepo.save( basket );
}

public String createOrderReference()
{
    return RandomStringUtils.random( 10, true, false ).toUpperCase();
}
}
@Mock
private BasketRepository basketRepo;

@Test
public void createBasketWithSameOrderRef() throws Exception
{
   basketService.setBasketRepository(basketRepo);
   ...