- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为我理解 @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/
我正在尝试使用@MockBean; java 版本 11、Spring Framework 版本 (5.3.8)、Spring Boot 版本 (2.5.1) 和 Junit Jupiter (5.7
我有一个使用多种服务的 Controller 类。我为该 Controller 编写了一个测试,例如: @RunWith(SpringRunner.class) @WebMvcTest(value =
在我的 Spring Boot 测试中,我使用了 2 个具有不同限定符的模拟 bean: @RunWith(SpringRunner.class) @SpringBootTest class Hoho
是否可以用真正的@Bean替换继承的@MockBean? 我有一个抽象类,它为所有 ITest 定义了许多配置和设置。仅对于一个测试,我想使用真实的 bean,而不是使用模拟的 bean。但仍然继承其
我有一个将被其他集成测试使用的基本测试场景。此方案包括一些用于外部集成的模拟 bean ( @MockBean )。 今天,我在集成测试类中有这样的东西: @SpringBootTest @WebAp
似乎返回 void 的模拟bean 在测试对象内部调用时不会抛出错误。我可以在外面调用它,但它会抛出错误。我的使用方式有问题吗? //some imports ... @RunWith(SpringR
我可以在 Controller 中使用@Autowired,例如 @RestController public class Index { @Autowired HttpServlet
我有一个使用 @WebMvcTest 的 Spring Boot 测试。我需要更新正在测试的 Controller ,以便它现在接受 Item 列表作为构造函数参数。该元素列表在构造函数中进行解析,以
我有一个配置类,其中有一些 MockBeans 替换了上下文中的实际 bean 以进行测试。 @Configuration public class MyTestConfig { @MockB
我有这个类定义 @RestController public class ReservationController { @Autowired private Reservation
在 Spring 应用程序中,可以使用默认 Autowiring 的模拟 bean 编写测试,并且可以使用常用的 Mockito 方法进一步自定义。为此,使用了@MockedBean 注释。但是,当只
我在 Spring Framework 上运行了几个集成测试,它们扩展了名为 BaseITCase 的基类。 像这样: @RunWith(SpringJUnit4ClassRunner.class)
我有一个 Spring Boot 1.4.2 应用程序。在启动期间使用的一些代码如下所示: @Component class SystemTypeDetector{ public enum S
目录 一个测试方法主要包括三部分 Junit 基本注解介绍 测试方法执行顺序 测试方法命名约定 基于 Spring 的单元测试编写
有了 JUnit,我可以很容易地使用 @MockBean : @SpringBootTest(classes = AppConfig.class) @RunWith(SpringRun
我正在使用 Cucumber 和 Spring Boot 进行测试 @CucumberContextConfiguration @ActiveProfiles(profiles = { "cucumb
我正在使用 Cucumber 和 Spring Boot 进行测试 @CucumberContextConfiguration @ActiveProfiles(profiles = { "cucumb
此问题涉及this one 。一旦确定了问题并成功应用了建议的解决方案,我就继续开发和重构我的代码,直到达到这一点。 正如您在下面的代码中看到的,我为在 Controller GetExchangeR
我有多个安全测试类,我在其中测试对不同 REST 端点的授权,我想模拟 ApplicationContext 将启动的所有存储库的 beans。我正在运行测试并且一切正常,但我不想在每个安全测试类中重
我正在尝试 @MockBean 一个 @Repository 注释类: @Repository public interface ApplicationDao extends MongoReposit
我是一名优秀的程序员,十分优秀!