当前位置: 首页 > 知识库问答 >
问题:

来自Spring上下文的模拟bean

安明亮
2023-03-14

我希望创建使用Spring上下文和模拟存储库bean的测试。我使用的是Spring Boot 1.3。2.构建快照JUnit Mockito。

以下是我的测试配置类:

@ComponentScan(basePackages = "myapp", excludeFilters =
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
        value = {
                OfferRepository.class
        }
)
)
@Configuration
public class TestEdge2EdgeConfiguration {

    @Bean
    public OfferRepository offerRepository() {
       return mock(OfferRepository.class);
    }

}

此配置的目的是将OfferPresository从Spring上下文中排除并对其进行模拟,由于此,我将能够编写使用Spring上下文和模拟数据库存储库的测试。

这是我的测试课:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {TestEdge2EdgeConfiguration.class})
@WebAppConfiguration
public class OfferActionsControllerTest {

    @Autowired
    private OfferRepository offerRepository;

    @Autowired
    private OfferActionsController offerActionsController;

    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void saveOffer() {
        //given
        BDDMockito.given(offerRepository.save(any(Offer.class))).willReturn(new Offer());
        //when
        ResponseEntity<Offer> save = offerActionsController.save(new Offer());

        //then
        org.springframework.util.Assert.notNull(save);
    }
}

测试和测试配置目录为:

src/test/java/myapp 

我的应用程序配置和包含OfferRepository目录的包是:

src/main/java/myapp/

问题是Spring Boot没有从TestEdge2EdgeConfiguration加载我的配置。永远不会创建OfferPresository的类和模拟。

有人能帮我吗?

共有2个答案

宇文金鑫
2023-03-14

使用Spingockito使用@ReplaceWithMock将bean替换为mock。如果您需要在测试中访问模拟bean,请不要忘记将@Autowired@ReplaceWithMock一起使用。

慕凌
2023-03-14

这是您应该如何做的(假设您正在为OfferActionController编写测试并注入OfferProposition):

@Mock
private OfferRepository offerRepository;

@InjectMocks
private OfferActionsController offerActionsController;

@Before
public void setUp(){
    MockitoAnnotations.initMocks(this);
}

您可以按照以下方式编写测试方法:

@Test
public void saveOffer() {
    /* Given */
    Mockito.when(offerRepository.save(Mockito.any(Offer.class))).thenReturn(new Offer());

    //when
    ResponseEntity<Offer> save = offerActionsController.save(new Offer());

    //then
    org.springframework.util.Assert.notNull(save);
}
 类似资料:
  • 问题内容: 我尝试使用以下代码段设置spring rest模拟的上下文路径: 但是我收到以下错误: 怎么了? 是否可以在代码中的单个位置(例如直接在构建器中)指定contextPath? 这里的控制器 问题答案: 您需要在传递到的路径中包括上下文路径。 在问题中显示的情况下,上下文路径为并且您想向其发出请求,因此您需要传递给:

  • 我使用Spring Boot 1.3.2,我注意到问题,ComponentScan在我的测试类不工作。我想嘲笑一些春豆。Spring引导是否阻止ComponentScan? 测试配置类: 测试类:

  • 行动时刻 - 模拟NAS的计费 在第3章,FreeRADIUS使用入门,我们介绍了radclient命令。 本部分创建三个可与radclient一起使用的文件,以模拟NAS通常发送到RADIUS服务器的计费数据包。 用于模拟的文件 三个文件中的AVP类似于从hostapd程序发送的AVP。 hostapd是一个守护进程,用于控制Wi-Fi网络上的身份验证。它可以配置为与身份验证一起进行计费,通常在

  • 问题内容: 我不明白为什么无法在此示例中模拟NamedTemporaryFile.name: 测试结果在: 问题答案: 您设置的模拟错误:不是上下文管理器,而是 返回 了一个上下文管理器。将您的设置行替换为: 这样您的测试就可以了。

  • AssertJ中有来自Hamcrest的everyItem()的模拟吗? 但是在AssertJ中,无论如何,我都必须手动迭代列表。

  • 我有以下情况。JDK 17,Spring-Boot:2.6.2。一个gradle多项目。一个项目是一个库(java-Library,没有Spring启动插件)。另一个项目是带有Spring启动插件的Spring启动应用程序。一般不使用Spring依赖管理插件,而是使用gradle平台概念。应用程序项目包括每个“实现(项目(':...” 图书馆: 库项目和spring boot应用程序项目有不同的包