草庐IT

JUNIT5 + Mockito

IOT_player 2023-05-01 原文

目录

一、前言

二、Maven依赖

2.1 JUNIT5

2.2 Mockito3

2.3 surefire

三、UT示例

3.1 业务代码

3.2 单元测试

一、前言

JUNIT和Mockito这两个单元测试框架在Java工程中被广泛应用。

但到2021年,仍有很多开发者在使用JUNIT4+Mockito2+PowerMock,但不得不说,这套配置已经开始过时。

如今,JUNIT5已经迭代到5.8.x,Mockito也进入了4.0.0阶段,我们可以开始尝试基于JUNIT5+Mockito3来进行单测的开发。由于PowerMock在JUNIT5上无法工作,所以不再使用PowerMock。Mockito3.4后,已经支持mock静态方法(Mockito (Mockito 3.5.10 API) (javadoc.io)),不引入PowerMock也能继续单测开发。

二、Maven依赖

2.1 JUNIT5

首先引入JUNIT5。

            <!-- junit5 -->
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter</artifactId>
                <version>5.8.2</version>
                <scope>test</scope>
            </dependency>

2.2 Mockito3

除了引入mockito-core外,还需要引入mockito-jupiter扩展包。

其中mockito-inline是对Mockito的增强,包括mock final类 static方法。

            <!-- mockito3 -->
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>3.12.4</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-inline</artifactId>
                <version>3.6.28</version>
                <scope>test</scope>
            </dependency>
            <!-- mockito for junit5 -->
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-junit-jupiter</artifactId>
                <version>2.23.0</version>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <artifactId>junit-jupiter-api</artifactId>
                        <groupId>org.junit.jupiter</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

2.3 surefire

为了单测能正常运行并被mvn test识别,还需要更新maven-surefire-plugin,添加相关依赖。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>1.2.0</version>
                    </dependency>
                </dependencies>
            </plugin>

三、UT示例

3.1 业务代码

@Service
public class DomainServiceImpl implements DomainService {

    @Resource
    private DataJpa dataJpa;

    @Override
    public Boolean foo(List<String> names) {
        int res = dataJpa.update(names);
        return res == 1;
    }
}

3.2 单元测试

在JUNIT5中,不再提供@RunWith注解,需要使用@ExtendWith注解。

为了让Mockito正常工作,需要在@ExtendWith注解中使用MockitoExtension.class

同时,@Before被@BeforeAll或者@BeforeEach替换,若使用@BeforeAll,需要写在静态方法上。

@ExtendWith(MockitoExtension.class)
class DomainServiceImplTest {

    @InjectMocks
    private DomainServiceImpl domainService;

    @Mock
    private DataJpa dataJpa;

    @BeforeAll
    static void setUp() {
    }

    @Test
    void foo() {
        List<String> names = Lists.newArrayList("a", "b");
        Mockito.when(dataJpa.update(Mockito.anyList())).thenReturn(1);
        boolean res = domainService.foo(names);
        Assertions.assertTrue(res);
    }
}

有关JUNIT5 + Mockito的更多相关文章

  1. 【单元测试】Junit 4(四)--Junit4参数化 - 2

    1.0前言​JUnit4引入了一项名为参数化测试的新功能。参数化测试允许开发人员使用不同的值反复运行相同的测试。1.1参数化设置这里我们直接上例子吧。题目:​输入小写的字符串。如字符串前缀为ab开头,则将前缀ab替换为ef并打印出替换后字符串,返回文字“替换前缀后的字符串为:”和替换后字符串值;如后缀为cd并且前缀不为ab,替换字符串中所有cd为gh并打印出替换后字符串,返回文字“替换cd后的字符串为:”和替换后字符串值;否则全部字母大写输出,返回文字“大写字母的字符串为:”和转换后的字符串值。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试编写Demo01.java代码:i

  2. go - 是否可以断言通过像 Java Mockito 一样在 Go 中进行 spy 事件来调用真正的方法? - 2

    我正在寻找断言我的测试中涵盖了一个语句。例如,假设从测试开始调用methodA(),它引用了methodB()。我想断言在从测试中执行methodA()时会调用methodB()。在下面的代码中,我如何在Go测试中断言svc.AddCheck()在执行svc.OnStartup()时被调用?func(svc*Servjice)OnStartup()error{iferr:=svc.AddCheck("cache");err!=nil{returnerr}returnnil} 最佳答案 Isitpossibletoassertthat

  3. go - Ginkgo 到 Cobertura 和 JUnit - 2

    我使用Shippable作为我的CI,我的项目基于Go1.11。所有单元测试都是使用Ginkgo和Gomega以BDD风格编写的。在我的测试管道中,我有类似的东西:gocovtest./...|gocov-xml>shippable/codecoverage/coverage.xmlgotest-v./...|go-junit-report>shippable/testresults/junitresults.xml这将创建Cobertura格式的覆盖率文件和JUnit格式的单元测试报告。在我的项目中,我们有多个测试套件。我计划使用GinkgoCLI来执行覆盖率和单元测试,而不是goc

  4. java - Spring xml + JUnit - xml 上下文文件在 src/test/resources 中不起作用但在 src/main/resources 中起作用 - 2

    我遇到这样的junit测试问题。出于某种原因,spring上下文文件只有在我将它们放在maven项目的src/main/resources文件夹中时才有效。Intellij没有给我任何警告,但来自mvn和idebomb的junit测试运行程序。两种情况下的代码和输出如下:@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration({"classpath:/test-applicationContext.xml"})publicclassDataSharingTest{AuthTokenServiceauthTokenServ

  5. junit4-参数化测试方法 - 2

    参数化测试主要解决一次性进行多个测试用例的测试。其主要思想是,将多个测试用例按照,{输入值,输出值}(输入值可以是多个)的列表方式进行测试。本文使用的是Eclipse+Junit4进行测试。之所以使用Eclipse+Junit4而不是使用Idea+Junit5的环境。是因为Eclipse+junit4环境能够轻易生成ant自动化测试报告。(关于自动化测试报告后面进行讲述)主要看PeopleTestParameterized.java文件项目结构Clothes.javapackagebarry;publicabstractclassClothes{publicabstractdoublegetp

  6. xml - JUnit 4 结果到 XML 的转换 - 2

    我一直在尝试编写代码,使用Junit报告的标准模式从Junit结果对象生成XML输出。我正在使用Junit4触发我的测试,因此我正在使用JunitCore实例来执行我​​的测试。因此,在我的案例中,使用JunitTask实例复制执行是没有意义的。我正在覆盖Junit4中可用的testRunfinished(Result)方法。我想在这里编写转换逻辑,以便它生成XML,然后可以使用标准XSLT查看该XML。一种方法是编写一个创建文档对象的转换器,然后以编程方式添加节点,从而创建XML。但这会硬连接报告结构。Ant公开的所有类似乎都适用于Junit3,并且似乎没有将执行测试和报告结果的关注

  7. java - junit:开发测试用例的最佳实践? - 2

    技术:Junit最新版本应用面向业务有些人使用硬编码数据作为测试用例,有些人使用属性文件和一些xml文件。据我所知,xml比其他两个好。是否有一些更好的方法在工业中使用。请建议开发测试用例的最佳实践。 最佳答案 重要的是,测试中的数据表示与传递给被测函数的数据之间的映射尽可能透明。如果数据很少且易于在源中观察,则硬编码数据完全可以。为理解测试用例而需要打开的窗口越少越好。XML最适合嵌套的树状数据,但它有点冗长。YAML也可能对此有好处。对于平面数据,属性和仅按行组织的文件都可以。没有在所有方面都优于所有其他格式的单一格式。为特定的

  8. c++ - 如何获取 JUnit 格式的 CMocka 报告? - 2

    我能够使用cmocka并在屏幕上获得默认结果。我想获得JUnit格式的单元测试结果。CMocka通过使用环境变量CMOCKA_MESSAGE_OUTPUT或使用APIcmocka_set_message_output(CM_OUTPUT_XML);支持JUnit格式但仍然没有生成xml文件。谁能帮忙获得JUnit格式的结果? 最佳答案 最可靠的来源实际上是包含整个框架实现的cmocka.c源文件。这个文件不是太大,所以我将引用源文件版本1.0.1中的一些内容。cmocka生成XML输出有两个条件,第三个条件是将输出存储在文件中。1。

  9. xml - 什么 XSLT 将 JUnit Xml 格式转换为 JUnit Plain 格式 - 2

    我正在将我的构建从Ant转移到Gradle。Ant允许JUnit任务创建具有不同格式的多个报告。Gradle更具限制性——它生成一个HTML报告和一个XML报告。XML报告是JUnit文本报告的超集,因此它可以从一个报告转换为另一个报告。什么XSLT会将XML转换为文本?这是一个示例XML:这是我希望它生成的文本:Testsuite:edu.stsci.CoSI.test.DependencySupressingConstraintJUnitTestTestsrun:6,Failures:0,Errors:0,Timeelapsed:0.363sec-------------Stand

  10. xml - 需要 XSL 文件将内部 xml 测试格式转换为 Junit 格式(jenkins 的 xUnit 插件) - 2

    我正在尝试编写一个XSL以将我的XML转换为jenkins采用的JUNIT格式(见下文)我的xml看起来像这样:(我有几个“类”,如“数据中心”或“网络”)CreateNFSDataCenter2011-06-1301:22:5512011-06-1301:22:52PassCreateNFSDataCenter2011-06-1301:22:5512011-06-1301:22:52PassNetworktest12011-06-1301:22:5712011-06-1301:22:52Pass.....我从WebUI插件中获取了一个XSL并尝试更改它,我已经完成了一半,但它仍然很棘

随机推荐