为什么jUnit 5没有看到我的异常测试?

时间:2020-06-21 15:28:25

标签: java testing exception junit

我已经编写了48种测试方法来测试课程分配。它们都不是例外测试,但是它们可以正常工作。

最后,我尝试测试自己的异常,但JUnit 5看不到它。我的代码设计和异常测试有一些示例。

import static org.junit.jupiter.api.Assertions.*;
import org.junit.Test;
import junit.framework.TestCase;

public class Final_Tests extends TestCase {
    
    @Test
    public static void testD4_setChair() {
    Department testD = new Department("CSE 101","CSE 101!");
    Teacher testT = new Teacher("Ali","Veli.com",testD,"CV");
    testD.setChair(testT);
    assertEquals(testT,testD.getChair());
}

测试非异常方法没有问题。

问题在这里:

@Test 
public static void DepartmentMismatchException_Test() {
Department testD = new Department("CSE 101","CSE 101!");
Teacher testT = new Teacher("Mehmet", "mehmet.com", testD, "CV Mehmet");
Course testC1 = new Course(testD,101,"Test Course 1","Test Course 1 Desc.",testT,6);
String expMsg = "DepartmentMismatchException: Teacher in " + testT.getDepartment().getCode()+ ", Course in " +testC1.getDepartment().getCode();
    
DepartmentMismatchException dme =  new DepartmentMismatchException(testT.getDepartment(), testC1.getDepartment());
    assertEquals(expMsg, dme.toString());
}

代码设计是否存在问题,例如使用范围,静态或其他修饰符,或者关于我的异常测试代码?

2 个答案:

答案 0 :(得分:1)

来自JUnit5 @Test javadoc:

@Test方法不能是私有或静态的,并且不能返回值。

因此,您应该从其中删除static关键字,然后测试才能正常运行。

通常,异常会以某种方式测试throw异常并验证其是否正确thrown。我看到您正在实例化它并验证消息是否符合预期,但是最好的方法是:

@Test
public void DepartmentMismatchException_Test() {
    Department testD = new Department("CSE 101","CSE 101!");
    Teacher testT = new Teacher("Mehmet", "mehmet.com", testD, "CV Mehmet");
    Course testC1 = new Course(testD,101,"Test Course 1","Test Course 1 Desc.",testT,6);
    String expMsg = "DepartmentMismatchException: Teacher in " + testT.getDepartment().getCode()+ ", Course in " +testC1.getDepartment().getCode();

    Exception thrownException = Assertions.assertThrows(DepartmentMismatchException.class, () -> /* Some code that throws your exception */);
    assertEquals(expMsg, thrownException.toString() /* or maybe thrownException.getMessage() */);
}

您可以查看教程和更多示例here

答案 1 :(得分:0)

如果是的话,我假设testT.getDepartment()将抛出DME,请尝试使用org.junit.Rule

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

    @Test 
    public void DepartmentMismatchException_Test() {
        Department testD = new Department("CSE 101","CSE 101!");
        Teacher testT = new Teacher("Mehmet", "mehmet.com", testD, "CV Mehmet");
        Course testC1 = new Course(testD,101,"Test Course 1","Test Course 1 
        Desc.",testT,6);
        String expMsg = "DepartmentMismatchException: Teacher in " + 
        testT.getDepartment().getCode()+ ", Course in " 
        +testC1.getDepartment().getCode();
    
        testT.getDepartment(); // or any other st. which you expect it to throw DME
        myExpectedException.expect(DepartmentMismatchException .class);
        myExpectedException.expectMessage(expMsg);
    }