繁体   English   中英

如何测试@Before方法?

[英]How to test @Before method?

JUnit 4.12

我目前正在为类方法编写测试。 这是它的样子

public interface MyInterface{
    //method declaration
}

public class MyClass implements MyInterface{

    private int a;
    private in b;

    public MyClass(int a, int b){
        if(a <= b + 5)
            throw new IllegalArgumentException("Invalid arguments");
        this.a = a;
        this.b = b;
    }

    //methods
}

现在,我要测试该类:

public class MyClassTest{
    private static final int THRESHOLD = 1000;

    private MyClass mc;

    @Before
    public void init(){
        Random rnd = new Random();
        int a = rnd.nexInt(THRESHOLD), 
            b = rnd.nexInt(THRESHOLD);
        mc = new MyClass(a, b);
    }
}

但是在这种情况下, init()可能会引发异常。 因此,我想测试保留不变式以及初始化对象以测试其其他方法。

如何在JUnit中正确执行此操作?

@Before旨在初始化测试所需的任何内容。 如果您想检查任何内容-@ Test方法是显而易见的地方。

对于您的情况,我认为您应该创建几个单独的测试方法,以显式地传递有效和无效的参数。 这样,如果测试失败,就可以知道为什么会发生,如果没有失败-您可以确定逻辑是正确的。 如果您使用random,则不能确定:也许测试的代码仍然正确,或者random值刚刚合适,您很幸运。

您需要两个测试类。

测试构造函数行为的第一个。 其次是测试方法的行为。 此外,我将假定每个测试的方法都需要@before中定义的代码。

因此,我们有:

public interface MyInterface{
    //method declaration
}

public class MyClass implements MyInterface{

private int a;
private in b;

public MyClass(int a, int b){
    if (a <= b + 5) {
        throw new IllegalArgumentException("Invalid arguments");
    }
    this.a = a;
    this.b = b;
}

//methods
}

现在我们为构造函数创建测试

public class MyClassConstructorTest{
private static final int THRESHOLD = 1000;

@Test
public void allArgsConstructor_okValues_shouldCreateObjectOK(){
    // Given
    int a = 0; 
    int b = a - 5;
    // tested method
    new MyClass(a, b);
    // then no exception (test: ok)
}


@Test(expected = IllegalArgumentException.class)
public void allArgsConstructor_aLesserBplus5_shouldThrowException(){
    // Given
    int a = 0; 
    int b = a; 

    // tested method
    new MyClass(a, b);
    // then fail constructor assertion
    // see expected annotation
}

// other tests for constructor you need?

}

之后,您将创建正常测试:

public class MyClassTest{
private static final int THRESHOLD = 1000;

private MyClass mc;

@Before
public void init(){
    int a = 0; 
    int b = a+5;
    mc = new MyClass(a, b);
}

// normal test that use @before
}

PS:也指出了意见:切勿在测试中使用随机。

PS2:不确定是否可以,但是您可能应该将问题重命名为:“如何测试构造函数方法”

我认为您的问题始于使用随机数。 如果在单元测试中使用随机数,则必须确保覆盖的范围适合一种情况,也只能一种情况。 在您的情况下,您实际上有以下三种情况:

  1. a <b + 5-会生成您的异常(顺便说一句,始终使用赞扬是一个好习惯:{})。
  2. a> b + 5-这是有效的情况。
  3. a = b + 5-这是另一种无效情况

您需要测试这三种情况,因此需要为每种情况进行设置。 您遇到的问题是您试图将所有情况合并为一个。 在单元测试中强烈建议不要进行这种测试,因为您正在引入一个可变代码组件,正如您所说的那样,该组件需要进行测试。 作为建议,使3 b变量b1和b2和b3

说a是一个随机数。 令b1 = a-5-1和b2 = a-5 + 1和b3 = a-5。然后为每种情况提供3种测试方法。 我建议您使用诸如MoreUnit之类的覆盖率工具,因为它可以确保检测到实际上需要更轻松地进行测试的所有不同情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM