gpt4 book ai didi

java - @Mock jpaRepository 调用真实的保存方法 @MockBean 调用模拟方法

转载 作者:行者123 更新时间:2023-12-01 17:46:49 25 4
gpt4 key购买 nike

我认为我理解 @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();
}
}

最佳答案

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

Annotation that can be used to add mocks to a Spring ApplicationContext.

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

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

@Mock
private BasketRepository basketRepo;

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

我在 Mockito Stubbing 上写了一篇文章如果您需要进一步阅读。

关于java - @Mock jpaRepository 调用真实的保存方法 @MockBean 调用模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54253761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com