@Mock jpaRepository вызывает метод реального сохранения, с другой стороны, @MockBean вызывает mocked метод - PullRequest
0 голосов
/ 18 января 2019

Мне показалось, что я понял разницу между @Mock и @MockBean, хотя я думал, что любой объект, который был смоделирован, никогда не вызывает реальные методы, хотя, когда я запускаю тест ниже, я вижу, что корзина была вставлена ​​в логи hsqldb. Так что теперь я немного озадачен тем, почему корзина вставляется при использовании @Mock, а не вставляется при использовании @MockBean.

INSERT INTO BASKET VALUES(5,'ABCDEFGHIJ','ACTIVE',1,'2019-01-18 12:00:36.066000','2019-01-18 12:00:36.066000')

С другой стороны, если я это сделаю, тогда hsqldb чисты. В обоих случаях проверка прошла успешно.

@MockBean
private BasketRepository 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();
}
}

1 Ответ

0 голосов
/ 18 января 2019

@MockBean - это аннотация Spring, и она должна использоваться в интеграционных тестах, чтобы заменить реальный боб фиктивным:

Аннотация, которую можно использовать для добавления макетов в Spring ApplicationContext.

Mockitos @Mock создает макет этого хранилища, но не вводит его в BasketService.

Если вам действительно нужно использовать макетированную версию Mockitos, вам придется сделать это вручную в тесте:

@Mock
private BasketRepository basketRepo;

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