混合JUnit4和JUnit5

Yomex OwoUnsplash拍摄的照片

JUnit是Java编程语言最受欢迎的测试框架之一。 在测试驱动开发(TDD)的开发中也很重要。 在2018年,该框架的最新版本JUnit5得以发布,许多使用JUnit平台的程序员不得不决定是否重构其在以前版本的JUnit中编写的现有代码。

本文是关于将JUnit4和JUnit5混合到正在进行的项目中,以在不重构所有已编写的JUnit4测试的情况下获得JUnit5的好处。 其目的不是深入描述JUnit5,而是提供迁移JUnit5支持的指南。

JUnit5具有开发人员将要使用的许多好处。 更好的异常处理,更好的参数测试,多testrunners等。 如果您像我一样,并且希望尽快迁移到更新的平台,那么您可能也知道这样做很痛苦。

幸运的是,JUnit5对与版本4并存提供了很好的支持。我认为这对于拥有成百上千的已编写测试的项目非常重要。 重构它们都是艰巨的工作,与采用新事物相比,放弃它要容易得多。

在下面的文章中,我分解了您需要遵循的步骤,以引入对测试的JUTIN5支持,同时仍然支持JUnit4测试。

假设我们有gradle项目

plugins {
id 'java'
id 'com.adarshr.test-logger' version '1.6.0'
}

group 'rainoko'
version '1.0-SNAPSHOT'

sourceCompatibility = 11

repositories {
mavenCentral()
}

dependencies {
testCompile('junit:junit:4.12')
}

wrapper {
gradleVersion = '5.2.1'
}

与一些简单的类SimpleNaturalCalculator.java

package ee.rainoko.junit5demo;

public class SimpleNaturalCalculator {
public int addition(int arg1, int arg2) {
return arg1 + arg2;
}

public int substraction(int arg1, int arg2) {
return arg1 - arg2;
}

public int multiplication(int arg1, int arg2) {
return arg1 * arg2;
}

public int division(int arg1, int arg2) {
return arg1 / arg2;
}
}

并覆盖了测试SimpleNaturalCalculatorTest.java

package ee.rainoko.junit5demo;

import org.junit.*;

import static org.junit.Assert.*;

public class SimpleNaturalCalculatorJunit4Test {
@Test
public void shouldAdd() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.addition(1, 2);

assertEquals (3, result);
}

@Test
public void shouldSubstract() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.substraction(1, 2);

assertEquals (-1, result);
}

@Test
public void shouldMultiply() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.multiplication(1, 2);

assertEquals (2, result);
}

@Test
public void shouldDivide() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.division(1, 2);

assertEquals (0, result);
}
}

如我们所见,这是一个使用org.junit批注的JUnit4测试

让我们用以下命令运行它:

gradlew test

我们得到以下结果:

ee.rainoko.junit5demo.SimpleNaturalCalculatorTest
  Test shouldAdd PASSED
Test shouldDivide PASSED
Test shouldSubstract PASSED
Test shouldMultiply PASSED

现在,我们已经使用JUnit4建立了一个标准项目。

让我们继续。 我们的目标是引入JUnit5支持。 与版本4不同,版本5具有模块化的库结构:[https://junit.org/junit5/docs/current/user-guide/]

JUnit 5 = JUnit平台 + JUnit Jupiter + JUnit Vintage

JUnit平台是在JVM上启动测试框架的基础。 [https://junit.org/junit5/docs/current/user-guide/]

JUnit Jupiter是新编程模型扩展模型的组合,用于在JUnit 5中编写测试和扩展。[https://junit.org/junit5/docs/current/user-guide/]

JUnit Vintage提供了一个TestEngine用于在平台上运行基于JUnit 3和JUnit 4的测试。[https://junit.org/junit5/docs/current/user-guide/]

现在知道了,让我们添加JUnit5支持。 首先,为避免混淆,让我们将junit4测试类重命名为SimpleNaturalCalculatorJunit4Test.java

让我们将JUnit5依赖项添加到gradle中

// JUnit Jupiter
testImplementation('org.junit.jupiter:junit-jupiter:5.4.0')

// JUnit Vintage
testCompileOnly('junit:junit:4.12')
testRuntimeOnly('org.junit.vintage:junit-vintage-engine:5.4.0') {
because 'allows JUnit 3 and JUnit 4 tests to run'
}

如您所见,我们添加了junit-jupiter。 还将junit:4.12标记为testCompileOnly。 如果我们想对旧的junit4测试进行任何修改,则仍然需要该库进行编译。 然后,我们还添加了junit-vintage-engine,以使junit平台能够与JUnit5测试并排运行JUnit4测试。

最后,我们还需要添加命令以使用JUnit5平台在Gradle中运行测试

test {
useJUnitPlatform()
}

不要让我们添加JUnit5测试类SimpleNaturalCalculatorJunit5Test.java

package ee.rainoko.junit5demo;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions. assertEquals ;

class SimpleNaturalCalculatorJunit5Test {
@Test
void shouldAdd() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.addition(1, 2);

assertEquals (3, result);
}

@Test
void shouldSubstract() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.substraction(1, 2);

assertEquals (-1, result);
}

@Test
void shouldMultiply() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.multiplication(1, 2);

assertEquals (2, result);
}

@Test
void shouldDivide() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.division(1, 2);

assertEquals (0, result);
}
}

正如您可以从进口确认的那样,我们现在使用junit jupiter。 注意,测试类受程序包保护,方法也受方法保护。 现在,JUnit5允许我们使用受程序包保护的修饰符,我认为,它可以更好地展示java的访问修饰符的目的。

让我们运行测试

gradlew test

我们有输出

ee.rainoko.junit5demo.SimpleNaturalCalculatorJunit4Test
 Test shouldAdd PASSED
Test shouldDivide PASSED
Test shouldSubstract PASSED
Test shouldMultiply PASSED
ee.rainoko.junit5demo.SimpleNaturalCalculatorJunit5Test
  Test shouldAdd() PASSED
Test shouldDivide() PASSED
Test shouldSubstract() PASSED
Test shouldMultiply() PASSED

我们甚至可以使用混合测试类。

package ee.rainoko.junit5demo;

import static org.junit.jupiter.api.Assertions. assertEquals ;

public class SimpleNaturalCalculatorJunitMixedTest {
@org.junit.Test
public void shouldAddJunit4() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.addition(1, 2);

org.junit.Assert. assertEquals (3, result);
org.junit.jupiter.api.Assertions. assertEquals (3, result);
}

@org.junit.jupiter.api.Test
void shouldAddJunit5() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.addition(1, 2);

org.junit.Assert. assertEquals (3, result);
org.junit.jupiter.api.Assertions. assertEquals (3, result);
}

@org.junit.Test
public void shouldSubstractJunit4() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.substraction(1, 2);

assertEquals (-1, result);
}

@org.junit.jupiter.api.Test
void shouldSubstractJunit5() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.substraction(1, 2);

assertEquals (-1, result);
}

@org.junit.Test
public void shouldMultiplyJunit4() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.multiplication(1, 2);

assertEquals (2, result);
}

@org.junit.jupiter.api.Test
void shouldMultiplyJunit5() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.multiplication(1, 2);

assertEquals (2, result);
}

@org.junit.Test
public void shouldDivideJunit4() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.division(1, 2);

assertEquals (0, result);
}

@org.junit.jupiter.api.Test
void shouldDivideJunit5() {
SimpleNaturalCalculator calculator = new SimpleNaturalCalculator();

int result = calculator.division(1, 2);

assertEquals (0, result);
}
}

如您现在所见,我们有来自org.junit和org.junit.jupiter.api的注释。 JUnit5平台为每种测试方法选择合适的引擎。

您甚至可以将旧的JUnit4包和新的JUnit5包中的断言以任何一种测试类型混合使用。

gradlew test

然后我们得到输出

ee.rainoko.junit5demo.SimpleNaturalCalculatorJunit4Test
  Test shouldAdd PASSED
Test shouldDivide PASSED
Test shouldSubstract PASSED
Test shouldMultiply PASSED
ee.rainoko.junit5demo.SimpleNaturalCalculatorJunitMixedTest
  Test shouldAddJunit4 PASSED
Test shouldDivideJunit4 PASSED
Test shouldMultiplyJunit4 PASSED
Test shouldSubstractJunit4 PASSED
ee.rainoko.junit5demo.SimpleNaturalCalculatorJunit5Test
  Test shouldAdd() PASSED
Test shouldDivide() PASSED
Test shouldSubstract() PASSED
Test shouldMultiply() PASSED
ee.rainoko.junit5demo.SimpleNaturalCalculatorJunitMixedTest
  Test shouldAddJunit5() PASSED
Test shouldDivideJunit5() PASSED
Test shouldMultiplyJunit5() PASSED
Test shouldSubstractJunit5() PASSED
SUCCESS: Executed 16 tests in 1s

请注意, JUnit4和JUnit5具有不同的@ Before…批注。 如果需要混合使用它们,请将两个注释都添加到setUp和tearDown方法中。

即使您的项目使用了大量的JUnit4测试,希望本文能帮助您迁移到JUnit5并立即受益

阅读更多

关于JUnit5,有很多很好的示例和文章。 也阅读它们

From: https://hackernoon.com/mixing-junit4-and-junit5-2da44956de8c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值