目录
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也能继续单测开发。
首先引入JUNIT5。
<!-- junit5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
除了引入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>
为了单测能正常运行并被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>
@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;
}
}
在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);
}
}
1.0前言JUnit4引入了一项名为参数化测试的新功能。参数化测试允许开发人员使用不同的值反复运行相同的测试。1.1参数化设置这里我们直接上例子吧。题目:输入小写的字符串。如字符串前缀为ab开头,则将前缀ab替换为ef并打印出替换后字符串,返回文字“替换前缀后的字符串为:”和替换后字符串值;如后缀为cd并且前缀不为ab,替换字符串中所有cd为gh并打印出替换后字符串,返回文字“替换cd后的字符串为:”和替换后字符串值;否则全部字母大写输出,返回文字“大写字母的字符串为:”和转换后的字符串值。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试编写Demo01.java代码:i
我正在寻找断言我的测试中涵盖了一个语句。例如,假设从测试开始调用methodA(),它引用了methodB()。我想断言在从测试中执行methodA()时会调用methodB()。在下面的代码中,我如何在Go测试中断言svc.AddCheck()在执行svc.OnStartup()时被调用?func(svc*Servjice)OnStartup()error{iferr:=svc.AddCheck("cache");err!=nil{returnerr}returnnil} 最佳答案 Isitpossibletoassertthat
我使用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
我遇到这样的junit测试问题。出于某种原因,spring上下文文件只有在我将它们放在maven项目的src/main/resources文件夹中时才有效。Intellij没有给我任何警告,但来自mvn和idebomb的junit测试运行程序。两种情况下的代码和输出如下:@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration({"classpath:/test-applicationContext.xml"})publicclassDataSharingTest{AuthTokenServiceauthTokenServ
参数化测试主要解决一次性进行多个测试用例的测试。其主要思想是,将多个测试用例按照,{输入值,输出值}(输入值可以是多个)的列表方式进行测试。本文使用的是Eclipse+Junit4进行测试。之所以使用Eclipse+Junit4而不是使用Idea+Junit5的环境。是因为Eclipse+junit4环境能够轻易生成ant自动化测试报告。(关于自动化测试报告后面进行讲述)主要看PeopleTestParameterized.java文件项目结构Clothes.javapackagebarry;publicabstractclassClothes{publicabstractdoublegetp
我一直在尝试编写代码,使用Junit报告的标准模式从Junit结果对象生成XML输出。我正在使用Junit4触发我的测试,因此我正在使用JunitCore实例来执行我的测试。因此,在我的案例中,使用JunitTask实例复制执行是没有意义的。我正在覆盖Junit4中可用的testRunfinished(Result)方法。我想在这里编写转换逻辑,以便它生成XML,然后可以使用标准XSLT查看该XML。一种方法是编写一个创建文档对象的转换器,然后以编程方式添加节点,从而创建XML。但这会硬连接报告结构。Ant公开的所有类似乎都适用于Junit3,并且似乎没有将执行测试和报告结果的关注
技术:Junit最新版本应用面向业务有些人使用硬编码数据作为测试用例,有些人使用属性文件和一些xml文件。据我所知,xml比其他两个好。是否有一些更好的方法在工业中使用。请建议开发测试用例的最佳实践。 最佳答案 重要的是,测试中的数据表示与传递给被测函数的数据之间的映射尽可能透明。如果数据很少且易于在源中观察,则硬编码数据完全可以。为理解测试用例而需要打开的窗口越少越好。XML最适合嵌套的树状数据,但它有点冗长。YAML也可能对此有好处。对于平面数据,属性和仅按行组织的文件都可以。没有在所有方面都优于所有其他格式的单一格式。为特定的
我能够使用cmocka并在屏幕上获得默认结果。我想获得JUnit格式的单元测试结果。CMocka通过使用环境变量CMOCKA_MESSAGE_OUTPUT或使用APIcmocka_set_message_output(CM_OUTPUT_XML);支持JUnit格式但仍然没有生成xml文件。谁能帮忙获得JUnit格式的结果? 最佳答案 最可靠的来源实际上是包含整个框架实现的cmocka.c源文件。这个文件不是太大,所以我将引用源文件版本1.0.1中的一些内容。cmocka生成XML输出有两个条件,第三个条件是将输出存储在文件中。1。
我正在将我的构建从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
我正在尝试编写一个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并尝试更改它,我已经完成了一半,但它仍然很棘