如何使用junit编写测试类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用junit编写测试类相关的知识,希望对你有一定的参考价值。

  首先我们需要先下载相应的 JUnit 相关的 JAR 包,下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成。

  使用简单的 @Test 注解实现我们的测试方法的编写和执行
  准备工作做好之后,接下来我们就可以开始尝试编写壹个简单的测试代码了。首先,我们编写了壹个 Calculator 类,并提供五个方法分别完成加减乘除以及求平方的运算。代码如下:

  package net.oschina.bairrfhoinn.main;
  public class Calculator
  public void add(int n)
  result += n;
  
  public void substract(int n)
  result -= n;
  
  public void multiply(int n)
  result *= n;
  
  public void divide(int n)
  result /= n;
  
  public void square(int n)
  result = n * n;
  
  public int getReuslt()
  return result;
  
  public void clear()
  result = 0;
  
  private static int result;
  
  

  在测试类中用到了JUnit4框架,自然要把相应地Package包含进来。最主要地一个Package就是org.junit.*。把它包含进来之后,绝大部分功能就有了。还有一句话也非常地重要“import static org.junit.Assert.*;”,我们在测试的时候使用的壹系列assertEquals()方法就来自这个包。大家注意壹下,这是壹个静态包含(static),是JDK5中新增添的壹个功能。也就是说,assertEquals是Assert类中的壹系列的静态方法,壹般的使用方式是Assert. assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。
  另外要注意的是,我们的测试类是壹个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明,我们接着会讲到。在测试类中,并不是每壹个方法都是用于测试的,所以我们必须使用“注解”来明确表明哪些是测试方法。“注解”也是JDK5的壹个新特性,用在此处非常恰当。我们可以看到,在某些方法的前有@Before、@Test、@Ignore等字样,这些就是注解,以壹个“@”作为开头。这些注解都是JUnit4自定义的,熟练掌握这些注解的含义,对于编写恰当的测试类非常重要。

  接下来我们创建壹个测试类 CalculatorTest.java,代码如下:

  package net.oschina.bairrfhoinn.test;
  import static org.junit.Assert.*;
  import org.junit.Test;
  import net.oschina.bairrfhoinn.main.Calculator;
  public class CalculatorTest
  private static Calculator calculator = new Calculator();
  @Test
  public void testAdd()
  calculator.add(7);
  calculator.add(8);
  assertEquals(15, calculator.getReuslt());
  
  
  

  首先,我们要在方法的前面使用@Test标注,以表明这是壹个测试方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出壹个异常。至于方法内该写些什么,那就要看你需要测试些什么了。比如上述代码中,我们想测试壹下add()方法的功能是否正确,就在测试方法中调用几次add函数,初始值为0,先加7,再加8,我们期待的结果应该是15。如果最终实际结果也是15,则说明add()方法是正确的,反之说明它是错的。assertEquals(15, calculator.getResult());就是用来判断期待结果和实际结果是否相等,其中第壹个参数填写期待结果,第二个参数填写实际结果,也就是通过计算得到的结果。这样写好之后,JUnit 会自动进行测试并把测试结果反馈给用户。
  如果想运行它,可以在 eclipse 的资源管理器中选择该类文件,然后点击右键,选择 Run As->JUnit Test 即可看到运行结果。

  使用@Test 的属性 Ignore 指定测试时跳过这个方法
  如果在写程序前做了很好的规划,那么哪些方法是什么功能都应该实现并且确定下来。因此,即使该方法尚未完成,他的具体功能也是确定的,这也就意味着你可以为他编写测试用例。但是,如果你已经把该方法的测试用例写完,但该方法尚未完成,那么测试的时候无疑是“失败”。这种失败和真正的失败是有区别的,因此 JUnit 提供了壹种方法来区别他们,那就是在这种测试函数的前面加上 @Ignore 标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。壹旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
  比如说上面的测试类 Calculator.java 中,假设我们的 Calculator 类的 multiply() 方法没有实现,我们可以在测试类 CalculatorTest 中先写如下测试代码:

  package net.oschina.bairrfhoinn.test;
  import static org.junit.Assert.*;
  import org.junit.Ignore;
  import org.junit.Test;
  import net.oschina.bairrfhoinn.main.Calculator;
  public class CalculatorTest
  private static Calculator calculator = new Calculator();
  ... //此处代码省略
  @Ignore("method square() not implemented, please test this later...")
  @Test
  public void testSquare()
  calculator.square(3);
  assertEquals(9, calculator.getReuslt());
  
  
参考技术A 1
首先创建一个java Project;将junit包和hamcrest-core包导入到项目中

2
创建一个source folder 资源文件夹 test,资源文件夹和普通的文件夹区别是,资源文件夹中的java文件可以被自动编译。

3
在java文件中编写java代码UserMananger.java,在test文件中创建一个与需要进行测试的java代码同包名称的TestUserManager.java文件。

4
junit4采用的是通过注解的方式(在方法的上面加上@).
@Before表示在所有方法运行前运行的方法;
@After表示在所有的方法运行之后执行的方法;
@Test表示这是一个测试方法
@BeforeClass表示在这个测试类构造之前执行的方法
@AfterClass表示在这个测试类构造之后执行的方法

5
如果是对某一个方法进行测试,在方法的名称上点击右键 --> run as --> JUnit Test

6
如果是对所有的方法都执行一遍,在类体上右键--Run as--> JunitTest .
绿色的表示运行通过的方法,红x的表示运行失败的方法.

如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?

【中文标题】如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?【英文标题】:How to inject a Spring bean in a JUnit 5 test class written in Kotlin? 【发布时间】:2019-06-04 12:32:51 【问题描述】:

我尝试使用 JUnit 5 和 Spring Boot 在 Kotlin 项目中测试某些内容,但我无法在我的测试类中注入 bean。

我尝试了很多不同的注解,但是注入神经元起作用了……

这是我的测试类:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
@ExtendWith(SpringExtension::class)
class FooTest 

   @Autowired
   lateinit var repo: BarRepository

   @BeforeAll
   fun setup() 
   

   @Test
   fun testToto() 
   

使用这种注释组合,代码会引发以下异常: java.lang.NoClassDefFoundError:org/springframework/boot/context/properties/source/ConfigurationPropertySource。 而且我实际上无法找到这个异常来自哪里......我试图对这个异常进行一些研究,但我没有找到任何令人满意的东西......

【问题讨论】:

【参考方案1】:

我猜你的依赖项有错误。如果您从https://start.spring.io/#!language=kotlin 生成一个新的 Spring Boot Kotlin 项目,然后按如下方式自定义您的依赖项,它将按预期工作:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <artifactId>junit</artifactId>
                <groupId>junit</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

还请注意,您不需要指定 @ExtendWith(SpringExtension::class),因为自 Spring Boot 2.1 起,@SpringBootTest 已经使用此注解进行元注解。

【讨论】:

感谢您的回答,但我不会开始新项目。我会浪费太多时间。我刚刚用你谈到的依赖项清理了我的 pom.xml,但它不起作用。如果我删除“ExtendWith”注解,注入将不起作用,并且我有 UninitializedPropertyAccessException(基本上是 Kotlin NPE)...您还有其他建议吗? 感谢您的帮助,您最终将我引向了解决方案。【参考方案2】:

我终于找到了解决问题的方法。我的 Spring Boot 版本最初是“1.5.3”,所以我将 pom.xml 更改为“2.0.2”版本。现在我的测试运行良好,并且我的 bean 已按预期正确注入。这是我的 pom.xml 的修改部分:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/>
</parent>

修改版本后一切正常。 以下是使用 Junit 测试的有用依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <scope>test</scope>
</dependency>

【讨论】:

以上是关于如何使用junit编写测试类的主要内容,如果未能解决你的问题,请参考以下文章

如何编写单元测试 (JUnit) 以使用 DAO 类检查数据库连接?

如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?

Junit4入门之如何编写好的测试类

如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?

如何编写单元测试?

如何从另一个模块访问测试类以在 junit 测试中使用?