Java单元测试实践-02.使用JUnit进行单元测试

使用 JUnit 编写单元测试 使用 JUnit 编写单元测试使用 JUnit 编写单元测试一、构建单元测试二、JUnit 的断言三、JUnit 框架四、JUnit 测试的组成方法的 Setup 和 Tear-downsuite 的 Setup 和 Tear-down五、JUnit 和异常六、JUnit 测试流程 使用 JUnit 编写单元测试 一、构建单元测试 需要遵循一些命名习惯:如果有一个名为 createAccount ... 阅读详情

Java单元测试实践-00.目录(9万多字文档+700多测试示例)
https://blog.youkuaiyun.com/a82514921/article/details/107969340

1. 使用JUnit进行单元测试

以下针对使用JUnit作为单元测试框架进行说明。

1.1. JUnit4

在示例代码中,使用JUnit4,版本为4.13。

1.1.1. 添加引用

参考“Gradle Dependency”( https://github.com/junit-team/junit4/wiki/Use-with-Gradle#gradle-dependency ),可通过以下方式在Gradle中引用JUnit 4.13。

'junit:junit:4.13'

1.1.2. @RunWith配置

参考“@RunWith annotation”( https://github.com/junit-team/junit4/wiki/Test-runners#runwith-annotation )。

当类使用@RunWith注解或者扩展使用@RunWith注解的类时,JUnit将调用它引用的类来运行该类中的测试,而不是JUnit中内置的运行器( runner )。

默认的运行器是BlockJUnit4ClassRunner,它取代了旧的JUnit4ClassRunner。

使用@RunWith(JUnit4.class)对类进行注解,将始终在当前版本的JUnit中调用默认的JUnit4运行器,此类的别名为当前默认的JUnit4类运行器。

可参考示例TestJUnit1类,未通过@RunWith指定运行器类;示例TestJUnit2类,通过@RunWith指定运行器类为BlockJUnit4ClassRunner,均能够正常执行。

1.1.3. 注解对应方法执行顺序

参考“Getting started”( https://github.com/junit-team/junit4/wiki/Getting-started ),需要在测试方法使用@Test注解。

参考“Test fixtures”( https://github.com/junit-team/junit4/wiki/test-fixtures )。

JUnit有四个固定注解:两个用于类级别,两个用于方法级别。在类级别,有@BeforeClass和@AfterClass,在方法( 或测试 )级别,有@Before和@After。

JUnit4中的常用注解包含@BeforeClass、@Before、@Test、@After、@AfterClass等,API文档地址如下:

注解文档地址
@BeforeClasshttps://junit.org/junit4/javadoc/4.12/org/junit/BeforeClass.html
@Beforehttps://junit.org/junit4/javadoc/4.12/org/junit/Before.html
@Testhttps://junit.org/junit4/javadoc/4.12/org/junit/Test.html
@Afterhttps://junit.org/junit4/javadoc/4.12/org/junit/After.html
@AfterClasshttps://junit.org/junit4/javadoc/4.12/org/junit/AfterClass.html

以上API文档中关于注解的执行顺序的说明如下:

  • @BeforeClass

使用@BeforeClass注解的public static void无参数方法会使它在类中的任意测试方法之前运行一次。

  • @Before

使用@Before注解的public void方法使该方法在每个@Test方法之前运行。

  • @Test

@Test注解告诉JUnit其附加的public void方法可以作为测试用例运行。

  • @After

使用@After注解public void方法会使该方法在每个@Test方法之后运行。即使@Before或@Test方法抛出异常,所有的@After方法都会运行。

  • @AfterClass

使用@AfterClass注解public static void方法,会使当前类中的所有测试结束之后运行该方法。即使@BeforeClass方法抛出异常,所有@AfterClass方法都会运行。

通常可以在@BeforeClass、@Before注解对应方法中进行测试准备工作;在@Test对应方法进行测试操作;在@After、@AfterClass对应方法中进行检查或清理等操作。

上述注解对应方法的执行顺序为:@BeforeClass->@Before->@Test->@After->@AfterClass,可参考示例TestJUnitAnnotationOrder类。

1.1.4. 注解对应方法执行次数

JUnit4文档对于@BeforeClass、@Before、@After、@AfterClass对应方法的执行次数的说明如下:

  • @BeforeClass对应方法在对应的测试类执行时,会执行一次,且在其他方法前执行;
  • @AfterClass对应方法在对应的测试类执行时,会执行一次,且在其他方法后执行;
  • @Before对应方法在每个@Test方法执行前都会执行一次;
  • @After对应方法在每个@Test方法执行后都会执行一次。

可参考示例TestJUnitAnnotationTimes类。

1.1.5. 注解对应方法在子类及超类中的执行顺序

在@BeforeClass、@Before、@After、@AfterClass的API文档中,关于使用继承时的执行顺序说明如下:

  • @BeforeClass

超类的@BeforeClass方法会在当前类的方法之前运行;

  • @Before

超类的@Before方法会在当前类的方法之前运行;

  • @After

在超类中声明的@After方法将在当前类的方法之后运行;

  • @AfterClass

在超类中声明的@AfterClass方法将在当前类的方法之后运行。

可参考示例TestJUnitChild1、TestJUnitParent1类。

1.1.6. 子类覆盖超类的注解对应方法

在@BeforeClass、@Before、@After、@AfterClass的API文档中,说明当子类覆盖超类的以上注解对应方法时,超类中的方法不会执行。

例如超类中存在指定了@Before注解的before()方法,在子类中也存在同名的指定了@Before注解的方法,则执行测试时,子类中的before()方法会执行,但超类中的不会执行。为了使超类中的方法也执行,应使子类与超类中使用了相同注解的方法不同名。

可参考示例TestJUnitChild2、TestJUnitParent2类。

1.1.7. @Test注解的位置

@Test注解可以只出现在超类中,不出现在子类中,适用于准备工作不同,但测试执行操作及结果相同的情况。可参考示例TestJUnitChild3、TestJUnitParent3类。

1.1.8. @Test方法执行顺序

参考“Test execution order”( https://github.com/junit-team/junit4/wiki/Test-execution-order )。

从设计上,JUnit不指定测试方法调用的执行顺序。到目前为止,这些方法只是按反射API返回的顺序调用。但是,使用JVM顺序是不明智的,因为Java平台没有指定任何特定顺序,实际上JDK7返回的顺序会有或多或少的随机。当然,编写良好的测试代码不应对执行顺序进行任何假设,但有时可能需要这样做,并且可预测的失败优于某些平台上的随机失败。

JUnit从版本4.11开始,将默认使用确定性但不可预测的顺序(MethodSorters.DEFAULT)。若需要更改测试执行顺序,可在测试类指定@FixMethodOrder注解,并指定一个可用的MethodSorters:

  • @FixMethodOrder(MethodSorters.JVM):按JVM返回的顺序对测试方法进行排序,顺序在执行时可能会出现差异。

  • @FixMethodOrder(MethodSorters.NAME_ASCENDING):按方法名称的字典顺序对测试方法进行排序。

@FixMethodOrder注解应添加在类级别,使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)可以指定一个测试类中的多个测试方法以字典顺序执行。可参考示例TestJUnitOrder1类。

1.1.9. @Test方法与测试类实例

JUnit在执行测试类的每个@Test方法前,都会执行测试类的无参数构造函数,创建新的实例。可参考示例TestJUnitMultiTest类。

1.1.10. 断言

参考“Assertions”( https://github.com/junit-team/junit4/wiki/Assertions )。

JUnit为所有基本类型和对象和数组(基本类型或对象的数组)提供重载的断言方法。 断言方法的参数顺序是预期值在前,实际值在后。 可选地,第一个参数可以是断言判断不通过时输出的String类型的消息。

参考Assert类的API文档( https://junit.org/junit4/javadoc/4.12/org/junit/Assert.html ),支持的方法包括assertArrayEquals()、assertEquals()、assertFalse()、assertNotEquals()、assertNotNull()、assertNotSame()、assertNull()、assertSame()、assertThat()、assertTrue()、fail()等,以上方法的使用根据方法名、参数或文档均容易理解。若使用以上方法对应的参数1为“String message”的方法,当断言检查不通过时,提示信息为message变量值。

Assert类中的方法可以使用静态导入,在调用时可以省略“Assert.”,例如“assertEquals("…", str)”。

1.1.10.1. 抛出异常

当断言检查实际值与预期值不符时,会调用Assert.fail()方法,抛出AssertionError异常,父类为Error。

Assert.fail()方法可以在单元测试代码中调用,会抛出异常,可以通过String message参数指定异常信息。

可参考示例TestAssertFail类。

1.1.10.2. 比较值是否相同/是否为同一个对象

用于比较是否相同的方法有两组,Assert.assertEquals()/Assert.assertNotEquals()与Assert.assertSame()/Assert.assertNotSame():

  • Assert.assertEquals()/Assert.assertNotEquals()方法,用于判断对象的值是否相同/不同;

  • Assert.assertSame()/Assert.assertNotSame()方法,用于判断是/不是同一个对象。

例如存在变量“Integer integer1 = Integer.valueOf(10000)”与“Integer integer2 = Integer.valueOf(10000)”,integer1与integer2满足Assert.assertEquals()方法的检查,但不满足Assert.assertSame()方法的检查(Integer的缓存范围使用默认的-128~127)。

可参考示例TestAssertEqualsSame类。

当需要判断是否为同一个对象时,也可以使用System.identityHashCode()方法获取对象的hashCode进行比较。

1.1.10.3. 使用匹配器Matcher

Assert.assertThat()方法定义为“public static <T> void assertThat(T actual, Matcher<? super T> matcher)”,T actual参数为需要检查的对象,Matcher<? super T> matcher参数为Matcher接口实现类,可在其中对参数值进行自定义检查操作,例如对对象的各个属性依次进行检查等。

Matcher接口实现类需要实现org.hamcrest.Matcher接口的方法,包括matches()、describeMismatch()、_dont_implement_Matcher___instead_extend_BaseMatcher_()、describeTo()等方法,可以不指定范型类型。

matches()方法用于判断被检查对象是否符合预期,传入的Object item参数为被检查对象,当返回true时代表检查通过,false代表不通过。

describeMismatch()方法当matches()方法检查不通过时会被调用,参数中的Object item为被检查的对象。

Matcher接口实现类可以通过构造函数的参数接收预期的参数值等。

Matcher接口实现类示例如下:

private String id;
private String flag;

public TestMatcherTestTableEntity(String id, String flag) {

    this.id = id;
    this.flag = flag;
}

@Override
public boolean matches(Object item) {

    if (!(item instanceof TestTableEntity)) {

        logger.error("not instanceof TestTableEntity {}", item);

        return false;
    }

    TestTableEntity testTableEntity = (TestTableEntity) item;

    return id.equals(testTableEntity.getId()) && flag.equals(testTableEntity.getFlag());
}

可参考示例TestMatcherTestTableEntity类。

调用Assert.assertThat()方法示例如下:

assertThat(testTableEntity, new TestMatcherTestTableEntity(TestConstants.FLAG1, TestConstants.FLAG2));

可参考示例TestAssertThat类test1方法。

Matcher接口实现类可以使用匿名类,示例如下:

assertThat(testTableEntity, new Matcher<TestTableEntity>() {
    @Override
    public boolean matches(Object item) {

        if (!(item instanceof TestTableEntity)) {

            logger.error("not instanceof TestTableEntity {}", item);

            return false;
        }

        TestTableEntity testTableEntity = (TestTableEntity) item;

        return TestConstants.FLAG1.equals(testTableEntity.getId()) && TestConstants.FLAG2.equals
                (testTableEntity.getFlag());
    }

    @Override
    public void describeMismatch(Object item, Description mismatchDescription) {
        logger.error("{} mismatch!", item);
    }

    @Override
    public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
    }

    @Override
    public void describeTo(Description description) {
    }
});

可参考示例TestAssertThatAnonymous类test1方法。

1.1.10.3.1. 使用简化的Matcher实现类

Matcher接口提供了4个方法需要实现,比较繁琐,可以使用实现Matcher接口的抽象自定义类,仅提供类似matches()方法的抽象方法,供实现类实现。可参考示例中实现Matcher接口的抽象类TestMatcherSimple,如下所示。在matches方法中对参数进行了强制类型转换,并调用matches2方法处理,在使用时继承该类时只需要实现matches2方法即可。

public abstract class TestMatcherSimple<T> implements Matcher<T> {

    private static final Logger logger = LoggerFactory.getLogger(TestMatcherSimple.class);

    @Override
    public boolean matches(Object item) {

        if (item == null) {
            return false;
        }

        T item2 = (T) item;

        return matches2(item2);
    }

    public abstract boolean matches2(T item);

    @Override
    public void describeMismatch(Object item, Description mismatchDescription) {
        logger.error("{} mismatch!", item);
    }

    @Override
    public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
    }

    @Override
    public void describeTo(Description description) {
    }
}

继承TestMatcherSimple的自定义类示例如下:

public class TestMatcherTestTableEntity2 extends TestMatcherSimple<TestTableEntity> {

    private String id;
    private String flag;

    public TestMatcherTestTableEntity2(String id, String flag) {

        this.id = id;
        this.flag = flag;
    }

    @Override
    public boolean matches2(TestTableEntity item) {

        return id.equals(item.getId()) && flag.equals(item.getFlag());
    }
}

在Assert.assertThat()方法中使用继承TestMatcherSimple的自定义类示例如下:

assertThat(testTableEntity, new TestMatcherTestTableEntity(TestConstants.FLAG1, TestConstants.FLAG2));

可参考示例TestAssertThat类test2方法。

使用继承TestMatcherSimple的匿名类示例如下:

assertThat(testTableEntity, new TestMatcherSimple<TestTableEntity>() {

    @Override
    public boolean matches2(TestTableEntity item) {

        return TestConstants.FLAG1.equals(item.getId()) && TestConstants.FLAG2.equals
                (item.getFlag());
    }
});

可参考示例TestAssertThatAnonymous类test2方法。

1.1.11. 异常测试

参考“Exception testing”( https://github.com/junit-team/junit4/wiki/Exception-testing )。

对于预期会出现指定异常的情况,JUnit提供了比较方便的检测方法,如使用@Test注解的expected属性,或使用ExpectedException类。当未出现异常,或出现的异常不符合预期时,会抛出AssertionError异常。

1.1.11.1. 使用@Test注解的expected属性

可以使用@Test注解的expected属性,检查是否出现指定的异常,使用示例如下:

@Test(expected = RuntimeException.class)

expected属性只能检查异常类,无法检查异常信息。当需要检查异常信息时,可在代码中通过try-catch对预期会出现异常的代码进行捕获,检查异常信息后再抛出异常。示例如下。

@Test(expected = RuntimeException.class)
public void test2() {

    try {
        testException();
    } catch (RuntimeException e) {

        logger.info("error: {}", e);

        assertEquals(TestConstants.MOCKED, e.getMessage());

        throw e;
    }
}

当测试代码中出现异常后,后续代码不会继续执行。假如需要在出现异常后,继续执行后续代码时,可在代码中通过try-catch对预期会出现异常的代码进行捕获,进行后续处理后再抛出异常。

可参考示例TestJUnitException1类。

1.1.11.2. 使用ExpectedException类

ExpectedException支持对异常类及异常信息等进行检查,使用示例如下:

@Rule
public ExpectedException expectedException = ExpectedException.none();

expectedException.expect(RuntimeException.class);
expectedException.expectMessage("...");

//出现异常的代码

ExpectedException类的expect()方法参数类型为Class,可以检查异常类是否符合预期;expectMessage()方法参数类型为String,可以检查异常信息是否符合预期。

当测试代码中出现异常后,后续代码不会继续执行。假如需要在出现异常后,继续执行后续代码时,可在代码中通过try-catch对预期会出现异常的代码进行捕获,进行后续处理后再抛出异常。示例如下。

expectedException.expect(RuntimeException.class);
expectedException.expectMessage(TestConstants.MOCKED);

try {

    testException();
} catch (Exception e) {

    flag2a = true;

    throw e;
}

可参考示例TestJUnitException2类。

1.1.11.3. 使用Matcher接口实现类检查异常信息

ExpectedException类的expect、expectMessage方法返回值均为void,无法直接返回异常信息。expect与expectMessage方法的参数支持org.hamcrest.Matcher,可以使用Matcher接口的实现类,进行自定义的检查操作,例如使用比较复杂的规则检查异常类与异常信息,打印异常类名、调用堆栈、异常信息等。

matches()方法传入的Object item参数为异常对象或异常信息。

describeMismatch()方法传入的Object item参数为异常对象或异常信息。

Matcher接口实现类的使用可参考前文Assert.assertThat()方法对应的内容,Matcher接口实现类可以通过构造函数的参数接收预期的异常类名或异常信息等。

示例中的TestMatcherExpClassEquals类可以检查异常类是否为指定的类,并打印异常类名、调用堆栈;TestMatcherExpClassIsInstance类可以检查异常类是否继承自指定的类,并打印类名、异常堆栈;TestMatcherExpMsgContains类可以检查异常信息是否包含指定字符串,并打印异常信息。

使用Matcher接口实现类示例如下:

expectedException.expect(new TestMatcherExpClassEquals(RuntimeException.class));
expectedException.expect(new TestMatcherExpClassIsInstance(RuntimeException.class));
expectedException.expectMessage(new TestMatcherExpMsgContains("..."));

可参考示例TestJUnitException3类。

1.1.11.4. 使用Assert.assertThrows()方法检查异常信息

参考 https://github.com/junit-team/junit4/blob/master/doc/ReleaseNotes4.13.md#pull-request-1633-deprecate-expectedexceptionnone 。

在JUnit 4.13中,ExpectedException.none()方法已被标记为过时,建议使用Assert.assertThrows()方法替代(在JUnit 4.12及之前的版本中,没有Assert.assertThrows()方法)。

Assert.assertThrows()方法使用可参考 https://github.com/junit-team/junit4/wiki/Exception-testing#using-assertthrows-method 。

Assert.assertThrows()方法使用示例如下:

RuntimeException exception = assertThrows(RuntimeException.class, () -> throw1());

assertEquals(TestConstants.FLAG1, exception.getMessage());

private void throw1() {
    throw new RuntimeException(TestConstants.FLAG1);
}

Assert.assertThrows()方法返回值为指定方法出现的异常,可用于比较或打印日志。

当Assert.assertThrows()方法中执行的方法出现异常时,Assert.assertThrows()方法之后的代码也会执行。

Assert.assertThrows()方法的参数1支持指定预期异常的父类。

在使用Assert.assertThrows()时,若未出现异常,或若实际出现的异常与预期不符时,会抛出AssertionError异常。

推荐使用Assert.assertThrows()方法检查异常信息,可参考示例TestJUnitException4类。

1.1.12. 使用Suite

参考“Aggregating tests in suites”( https://github.com/junit-team/junit4/wiki/Aggregating-tests-in-suites )。

使用Suite作为runner,可以手动构建包含多个测试类的套件。在使用Suite时,需要使用@RunWith(Suite.class)和@SuiteClasses(TestClass1.class,…)注解类。当运行Suite类时,将运行所有套件类中的所有测试类的方法。

Suite的使用示例如下:

@RunWith(Suite.class)
@Suite.SuiteClasses(value = {
        xxx1.class,
        xxx2.class
})
public class xxx {
}

可参考示例TestSuiteFrameworkJUnit类。

1.2. JUnit5

JUnit5与JUnit4相比,有一些新增的功能,及发生改变的功能。

1.2.1. 添加引用

“Example Projects”( https://junit.org/junit5/docs/current/user-guide/#overview-getting-started-example-projects )中说明,对于Gradle与Java,可以参考“junit5-jupiter-starter-gradle”工程,在该工程的build.gradle文件( https://github.com/junit-team/junit5-samples/blob/r5.5.2/junit5-jupiter-starter-gradle/build.gradle )中,通过以下方式引用JUnit5:

'org.junit.jupiter:junit-jupiter:5.5.2'

1.2.2. 对于IDE的支持

参考“IDE Support”( https://junit.org/junit5/docs/current/user-guide/#running-tests-ide )。

  • IntelliJ IDEA

IntelliJ IDEA自2016.2版以来支持在JUnit平台上运行测试。建议使用IDEA 2017.3或更新版本。

IntelliJ IDEA中捆绑了JUnit5,可能会由于版本冲突导致测试执行失败。为了使用不同的JUnit5版本( 如5.5.2 ),需要通过以下方式引用相应版本的junit-platform-launcher,junit-jupiter-engine和junit-vintage-engine:

"org.junit.platform:junit-platform-launcher:1.5.2"
"org.junit.jupiter:junit-jupiter-engine:5.5.2"
"org.junit.vintage:junit-vintage-engine:5.5.2"
  • Eclipse

自Eclipse Oxygen.1a( 4.7.1a )版本开始,Eclipse IDE为JUnit平台了提供支持。

经测试,引用上述版本的组件后,在Eclipse中也可以正常使用JUnit5。

1.2.3. 注解

JUnit5的注解相对JUnit4有一些变化,可以参考“Annotations”( https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations )。

JUnit5的注解的包变为org.junit.jupiter.api,@Test注解类名未变化,其他部分常用注解类名出现变化,如下所示:

JUnit4的注解JUnit5的注解
@BeforeClass@BeforeAll
@Before@BeforeEach
@After@AfterEach
@AfterClass@AfterAll

新增注解@DisplayName,可以指定测试类或测试方法在测试结果中的显示名称,参考 https://junit.org/junit5/docs/current/user-guide/#writing-tests-display-names 。

可参考示例TestJUnit1类。

1.2.4. 从JUnit4迁移到JUnit5

参考“Migrating from JUnit 4”( https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4 )。

其中说明了@RunWith不再存在,被@ExtendWith取代。

JUnit5有很多新的特性,在此不进行说明。

1.2.5. Mock框架支持

1.2.5.1. Mockito支持

Mockito支持JUnit5。参考“45. New JUnit Jupiter (JUnit5+) extension”( https://static.javadoc.io/org.mockito/mockito-core/3.1.0/org/mockito/Mockito.html#junit5_mockito ),“MockitoExtension”( https://static.javadoc.io/org.mockito/mockito-junit-jupiter/3.1.0/org/mockito/junit/jupiter/MockitoExtension.html )。

需要添加对于org.mockito:mockito-junit-jupiter的引用,如下所示:

"org.mockito:mockito-junit-jupiter:3.1.0"

在测试类中使用注解“@ExtendWith(MockitoExtension.class)”,而不是“@RunWith(MockitoJUnitRunner.class)”。

可参考示例TestMockitoNonSt1类。

1.2.5.2. PowerMock不支持JUnit5

参考github的以下issue,关于PowerMock不支持JUnit5,作者有答复。

https://github.com/powermock/powermock/issues/830
https://github.com/powermock/powermock/issues/906
https://github.com/powermock/powermock/issues/929

可参考示例TestPowerMockSt1类。

2. 单元测试代码需要注意的其他问题

2.1. 等待异步线程

当在被测试代码中使用线程执行操作时,可能出现测试代码执行完毕时,被测试代码中的线程还未结束的情况,此时被测试代码还未执行完毕,检查操作可能会不通过。可在测试代码中等待被测试代码执行完毕,再执行后续的检查操作。

例如在测试代码中获得线程池对象后,获取当前活跃线程数,等待直到变为0,如下所示:

while (threadPoolTaskExecutor.getActiveCount() > 0) {
	Thread.sleep(200L);
}

可参考示例TestThread类。

2.2. 基类设置为抽象类

在测试的基类中有时不会设置@Test方法,当JUnit尝试执行此类测试基类时会出现异常。可以将测试的基类设置为抽奖类,JUnit不会尝试执行,可避免以上问题。

2.3. 使用MockDriver类作为数据源驱动

当使用Druid作为数据源时,在程序启动时若连接数据库失败,会导致数据源初始化失败,程序也无法正常启动。

对于执行单元测试不需要执行数据库操作,但启动时需要连接数据库的情况,可将数据源的“driverClassName”参数使用“com.alibaba.druid.mock.MockDriver”,且“url”参数需以“jdbc:fake:”或“jdbc:mock:”开头。当满足以上情况时,Druid数据源在初始化时,不会实际连接数据库,即使没有可以访问的数据库,单元测试也能正常执行。示例如下:

<property name="driverClassName" value="com.alibaba.druid.mock.MockDriver"/>

<property name="url" value="jdbc:mock://"/>
Java单元测试框架 - JUnit 我们为什么需要单元测试框架? 为工程添加JUnit支持 编写JUnit单元测试案例 JUnit常用注解 JUnit常用断言 JUnit案例 Spring整合 阅读详情

相关推荐

IDEA中使用JUnit4单元测试

本文介绍JUnit单元测试的重要性,然后详细介绍了使用IDEA工具搭建单元测试的步骤。

梦晨涌京 2311

eclipse-junit单元测试

除了使用 junit 提供的默认 Rule 外,还可以自定义我们自己的 Rule, 自定义 Rule 需要继承 TestRule 接口,并实现其 apply 方法。

m0_65159391的博客 3056

单元测试使用JUnit 5

1. JUnit 是什么?JUnit 是一个 Java 编程语言的开源测试框架,它是xUnit架构的一部分,xUnit是为多种编程语言创建的单元测试库的通用名称。JUnit是由Erich Gamma和Kent Beck创建的,目前已经发展到JUnit 5。它提供了一些功能,使编写测试变得容易,包括支持多个测试用例、断言和报告。JUnit也是多功能的,允许用各种语言编写测试。JUnit 主要用于单元测试,但它也可用于其他测试,如功能和集成测试。功能测试是测试系统的功能。

技术博客 962

如何使用JUnit进行单元测试

JUnit单元测试 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),供Java开发人员编写单元测试之用。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。 要使用JUnit,必须在项目的编译路径中必须引入JUnit的库,即相关的.class文件组成的jar包。如何把JUni

Princess_Y 1330

「免费开源」从 OCR 识别到结构化输出:合同文本高效比对的完整解决方案!

本文将系统拆解这一解决方案的技术逻辑、实施步骤与落地价值,为企业合同管理数字化转型提供实操指南。字段提取:自动识别并提取预设的关键字段(如 “甲方”“乙方”“合同金额”“履约期限” 等),若遇到模糊表述(如 “付款时间为合同签订后 30 个工作日内”),系统可自动解析为 “履约期限:合同签订日 + 30 工作日”;预设结构化字段:根据合同类型(如采购合同、服务合同、租赁合同),定义需提取的关键字段(如 “甲方名称”“乙方名称”“合同金额”“有效期起 / 止日期”“履约地点”“违约金比例” 等);

qxsz_yyh的博客 836

区域法(zonal method)重构波前

目的:实现区域法的Matlab代码 1.理论介绍 区域法波前重构即从波前探测器测得的波前斜率中恢复出波前的相位值,其分为:休晋模型(Hudgin)[90]、绍契威尔模型(Southwell)[40]和弗雷德模型(Fried)[48]。 1.1 Fried模型,对于N×N微透镜阵列构成的网格: 以3*3的子透镜为例,解释上式,对其展开 改写为矩阵形式: 记作:S=AΦ,A根据N而确定。S是波前探测器测得的斜率,Φ是重构矩阵的相位值。 1.2 而Southwel...

EyRe1的博客 8196

Junit4单元测试

Junit4单元测试一、简介Junit4单元测试1.1 Junit1.2 单元测试1.3 Junit4单元测试好处1.4 测试覆盖及代码覆盖率二、使用Junit4单元测试(IDEA)2.1 配置2.2 新建test目录2.3 IDEA自动生成测试类三、测试类的编写(SSM)3.1 Dao类(Mapper类)3.2 Service类3.3 Controller类 一、简介Junit4单元测试 1.1...

ShootingStar_1998的博客 2849

使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析

双机系统(Two-Machine System)是电力系统中用于研究动态稳定性和控制策略的一个典型模型。它由两台同步发电机通过输电网络相互连接,模拟实际电网中的互联操作。当发生短路故障时,系统的暂态稳定性会受到挑战,可能导致发电机失步或电压崩溃。本教程将带你使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析。

amy_mhd的博客 8507

如何使用Java的JUnit进行单元测试,JUnit简单学习和实践

写好一个class之后,再写另外一个class用来测试自己写好的类里面的方法。 例如我自己定义的类里有一个User类: public class User{ private int id; private String name; private double salary; private String time; public Us...

LifeGoesOn 2710

【推荐100个unity插件】制作美丽 Unity 景观,增强Terrain材质表现的插件——GTS

GTS地形着色器是一款专为Unity设计的强大工具,可解决地形纹理绘制和光照处理的难题。它提供一键式配置,支持实时调整地形效果,包含细节注入、高度混合、雪注入等核心功能,并兼容网格地形和低多边形模型。插件完美集成Gaia天气系统,支持HDRP细分效果。安装后通过GTS管理器创建配置文件并应用到地形,即可快速生成高质量地形渲染。其模块化设计包含全局设置、网格转换和细节调整等面板,使开发者能灵活控制地形表现,显著提升视觉效果与性能表现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1566

OpenClaw 实战:7个真实场景的多 Agent 落地经验

《OpenClaw实战:7个真实场景的多Agent落地经验》摘要: 作者Maynor分享了从单Agent转向多Agent架构的实战经验。最初遇到的单Agent记忆混乱问题(如Flutter助手被C++话题干扰),通过拆分专项Agent(flutter-tutor/cpp-tutor等)并配置独立workspace解决。随后面临的技能调用混乱问题,采用"基础通用能力+专属能力"分层策略,通过Clawhub管理工具市场,将工具调用准确率从60%提升至95%。最后探讨多Agent协同方案,引入

Maynor的博客 1414

利用Junit实现eclipse单元测试

在eclipse中使用Junit进行单元测试 今天学会了用Junit在eclipse中进行单元测试,代码的测试工作,在整个软件开发中占有总要的地位,无论是代码开发阶段,还是代码维护阶段。另外边开发边测试的这种模式,同样也 会大大的提高开发效率。话不多说,先进行一个简单的Junit测试小demo。 一、eclipse运行界面 二、编写测试类代码 package com; publ...

weixin_33708432的博客 244

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1267

Java Junit单元测试

该文详解讲解了Junit单元测试在不同场景的各种使用方式

qq_49474843的博客 2147

基于 Qt C++ 的战术通信终端

logMessage(QString("新客户端连接来自: %1:%2").arg(incomingTcpSocket->peerAddress().toString()).arg(incomingTcpSocket->peerPort()));logMessage(QString("服务器已启动,在 [%1]:%2 监听IPv6连接...").arg(ui->lineEditAddress->text()).arg(port));

寒寒豆豆软件公司的博客 78

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

Java IDEA JUnit 单元测试

JUnit是一个开源的 Java 单元测试框架,它使得组织和运行测试代码变得非常简单,利用JUnit可以轻松地编写和执行单元测试,并且可以清楚地看到哪些测试成功,哪些失败JUnit 还提供了生成测试报告的功能,报告不仅包含测试的成功率,还能统计被测试代码的覆盖率。通过进行单元测试,我们可以确保每个方法按照预期正确运行。如果我们修改了某个方法的代码,只需要确保相应的单元测试通过,就可以认为修改是正确的。此外,测试代码本身也可以作为示例代码,用于演示如何调用该方法。

笔记 7298

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JUnit实践教程——Java的单元测试框架

JUnit是一个开源的Java单元测试框架,最初由Erich Gamma和Kent Beck在1997年创建。它以简单易用、灵活性强和丰富的功能而闻名,被广泛应用于Java项目的单元测试中。JUnit作为Java开发领域最流行的单元测试框架,为开发人员提供了强大的测试工具和实践技巧。通过学习和使用JUnit,可以提高代码的质量和稳定性,加快软件开发的迭代速度,为项目的成功交付提供有力支持。好了,以上就是本文的全部内容,如有问题欢迎留言讨论。

chowley的博客 2128

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何在Java中使用JUnit进行单元测试

如果你正在开发一个基于Web的Java应用,可以借助Chrome官网提供的开发者工具来监控和分析你的API请求、响应以及其他Web相关的任务。希望通过本文,你能够更加熟悉JUnit的使用方法,并在日常开发中灵活运用,提升开发效率。JUnit是一个开源的测试框架,用于编写和运行Java程序的单元测试。在JUnit的帮助下,开发人员可以快速地测试代码的正确性,减少错误,并提高开发效率。在这个测试类中,我们使用了@Test注解来标记一个测试方法,并使用assertEquals方法来验证加法的结果是否正确。

OKCRoss的博客 1897

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JUnit介绍:单元测试

本文将简单介绍单元测试以及如何使用单元测试

weixin_47510148的博客 1939

使用 JUnit 5 进行 Java 单元测试:最佳实践和技术说明

但是 org.junit 是较旧的测试框架,它是在 JUnit 4 中引入的,而 org.junit.jupiter.api 是较新的 Java 软件测试框架,它是在 JUnit 5 中引入的。JUnit 中的动态测试是在运行时生成的测试,而不是预定义的测试。然后我们使用 Mockito.when() 方法定义模拟对象的行为,该方法指定当使用参数 123 调用 getUserById() 方法时,模拟对象应返回名为“John”的 UserEntity 对象。因此,我们定期使用测试套件来组织我们的测试。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2132

【Java JUnit单元测试框架-60】深入理解JUnit:Java单元测试的艺术与实践

JUnit是一个开源的Java单元测试框架,由Erich Gamma和Kent Beck创建,是xUnit测试框架家族的一员。自1997年诞生以来,它已成为Java开发中事实上的单元测试标准。// 一个简单的JUnit测试示例@TestJUnit作为Java单元测试的事实标准,其强大功能和灵活性使其成为保证代码质量不可或缺的工具。通过本文的介绍,您应该已经掌握了从基础到高级的JUnit使用技巧。记住,好的测试不仅仅是让代码通过测试,而是要创建可维护、可读性强且能真正捕获回归的测试套件。

weixin_39033358的博客 1431

Java 单元测试完全指南:JUnit 5 的最佳实践

JUnit 5 提供了强大的功能和灵活性,让单元测试更高效、更易维护。在实际开发中,遵循最佳实践可以帮助你编写清晰、可靠的测试用例,为项目的稳定性保驾护航。你可以从简单的断言入手,逐步应用参数化测试、动态测试和 Mock 框架等高级功能,将 JUnit 5 的强大能力充分融入到你的开发流程中。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1538

java中Junit单元测试

Junit单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。Java里单元指一个类。 JUnit ,是一个开源的Java单元测试框架,是 Java的标准单元测试库,是非常重要第三方 Java 库,由 Kent Beck 和 Erich Gamma 开发。 Junit作为一个软件测试的工具,JUnit可以不破坏java原代码,使用方便,添加快捷,代

学习笔记 3万+

【Java】单元测试JUnit

我们在运行代码的时候都是一个方法方法的运行,是不可以只运行方法中的某一行代码,因此Java程序最小的功能单元是方法。单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此单元测试就是针对Java方法的测试,进而检查方法的正确性。以前没有单元测试的时候,只有一个main方法,如果一个方法的测试失败了,其他方法测试都会受到影响。因为main方法都是运行在main线程中的,一个方法只要出现了异常,那么这条线程就没了,下面的代码就执行不到了。

qq_39921135的博客 2449
上一篇: Java单元测试实践-00.汇总(9万多字文档+700多测试示例)
下一篇: Java单元测试实践-03.使用spring-test进行单元测试
adrninistrat0r
博客等级 码龄18年 395粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值