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

如何使用springboot 2运行单元测试

那存
2023-03-14

我有以下测试:

@SpringBootTest
@ExtendWith(SpringExtension.class)
class BookServiceImplTest {
    @MockBean
    private BookRepository bookRepository;
    @MockBean
    private LibraryService libraryService;

    @Autowired
    private BookServiceImpl bookService;

    @Test
    void create() {
        BookRequestDTO bookRequestDTO = new BookRequestDTO();
        Library library = new Library();
        Book expectedBook = new Book();
        when(libraryService.getById(bookRequestDTO.getLibraryId()))
                .thenReturn(library);
        when(bookRepository.save(any(Book.class)))
                .thenReturn(expectedBook);

        Book actualBook = bookService.create(bookRequestDTO);

        assertEquals(expectedBook, actualBook);
    }
}

这是好的,它可以运行,但是我想知道有没有一种方法可以将它作为单元测试而不是集成测试运行,并且仍然使用@mockbean@autowired。还是我错过了什么?

我试着只保留@ExtendWith(SpringExtension.class),但我得到一个关于找不到BookServiceImpl bean的异常。

我知道如何使用MockitoExtension和@mock、@injectmocks来实现它,但我想知道是否有一种更springboot的方法来实现它?

共有2个答案

萧秋月
2023-03-14

>

  • 删除@springboottest,这将加载整个上下文并减慢测试速度。@mockbean的作用是从指定的bean创建一个模拟,并将其添加到上下文中。由于没有上下文运行,因此使用@mockbean没有意义

    @runwith(SpringRunner.class)注释单元测试类

    对于注入依赖项,这是一个很好的实践,可以显式地创建配置文件和模拟bean,并使用它们创建目标bean。假设您使用的是基于构造函数的注入:

    @Profile("test")
    @Configuration
    public class BookServiceTestConfiguration {
    
    
        @Bean
        public BookRepository bookRepository() {
            return Mockito.mock(BookRepository.class);
        }
    
        @Bean
        public LibraryService libraryService() {
            return Mockito.mock(LibraryService.class);
        }
    
        @Bean
        public BookService bookService() {
           BookServiceImpl bookService = new BookServiceImpl(
                    bookRepository(), libraryService()
            );
    
           return userGroupService;
        }
    }
    

    然后将测试类编写为:

        @ActiveProfiles("test")
        @Import(BookServiceTestConfiguration .class)
        @RunWith(SpringRunner.class)
        public class BookServiceUnitTest {
    
            @Autowired
            private BookService bookService;
    
            // write unit tests
        }
    

  • 郭琨
    2023-03-14

    您可以通过四个步骤对其进行单元测试:

    • 删除@springboottest注释,因为它将整个spring上下文旋转-对于所有协作者都被嘲弄的单元测试不有用
    • 从BookServiceImpl声明中删除@Autowired批注,并添加@Beforeeach安装方法,在该方法中初始化BookService并将BookRepositoryLibraryService作为参数传递
    • 在ExtendWith批注中使用MockitoExtension而不是SpringExtension。在这里,我假设您能够使用Mockito这样的库来嘲弄您的合作者
    • 使用mockito的@mock而不是@mockbean,因为我们正在手动初始化BookService,所以不需要处理spring bean

    关于您的第一个问题,@mockbean@autowired是对集成测试有意义的注释,因为它们处理bean的模拟和注入。单元测试应该孤立地考虑这个类,嘲笑与其他类的交互,因此不需要旋转应用程序上下文和设置bean。

     类似资料:
    • 我通过以下命令克隆了Guava的存储库: 不幸的是,我收到了以下错误(在这里可以查看整个输出)。 如何运行Guava的单元测试?

    • 在以前的一个项目中,我使用Spock测试框架对Java代码进行单元测试。我发现这非常有效,所以我尝试将Spock测试添加到我当前的项目中,该项目使用Maven作为构建工具(前一个项目使用Gradle)。虽然我可以让Maven编译我的Spock测试(使用),但我无法让Maven运行这些测试。 我做了一个简单的例子来演示我在两个文件中的问题: null 当我执行(或)时,我希望运行单个单元测试并失败。

    • 我是新手。我使用Gradle1.10和Ubuntu13。 我想知道是否有任何命令只执行一个单元测试类,类似于SBT中的。

    • 我通过Extensions Manager添加了“xunit . net runner for Visual Studio”v 0 . 99 . 8,但是当我打开Test Explorer窗口时,它似乎没有选择我的任何单元测试。此外,Resharper 9 EAP确实是Resharper唯一支持VS2015的版本,但似乎还没有xUnit Test Runner的插件。 那么,如何在VS2015预览

    • ./gradlew test 执行gradle测试任务后所有的测试用例都会被运行,然后会产出测试报告. 测试报告存放在址: app\/build\/reports\/debug\/index.html 通过gradle工具栏执行的效果同命令行.

    • 问题内容: 摘要: 当在线程中引发断言错误时,单元测试不会消失。这是有道理的,因为不应允许一个线程使另一线程崩溃。问题是我该如何1)当第一个帮助程序线程崩溃时使整个测试失败,或者2)遍历并确定每个线程完成后的状态(请参见下面的代码)。后者的一种方法是通过每个线程具有状态变量,例如“ boolean [] statuss”,并具有“ statuses [i] == false”表示线程失败(可以扩展