如何运行单个测试,仍然可以访问测试套件中定义的资源?

时间:2015-12-03 07:51:03

标签: java junit

我创建了一个测试套件,使用@ClassRule打开连接等。现在我可以运行所有测试,连接只打开一次。

但是现在,当我尝试运行单个测试时,我收到错误,因为没有打开连接。我该如何解决这个问题?

代码说明了我正在尝试做的事情:

@RunWith(Suite.class)
@SuiteClasses({MyTestCase.class})
public class MyTestSuite {

    public static String connection = null;

    @ClassRule
    public static ExternalResource resource = new ExternalResource() {

        @Override
        protected void before() throws Throwable {
            connection = "connection initialized";
        };

        @Override
        protected void after() {
            connection = null;
        };
    };
}

public class MyTestCase {

    @Test
    public void test() {
        Assert.notNull(MyTestSuite.connection);
    }
}

编辑:@Jens Schauder建议之后的当前解决方案。工作,但看起来很难看。还有更好的方法吗?

public class ConnectionRule extends ExternalResource {

    private static ConnectionRule singleton = null;
    private static int counter = 0;

    private String connection = null;

    public static ConnectionRule newInstance(){
        if(singleton == null) {
            singleton = new ConnectionRule();
        }
        return singleton;
    }

    @Override
    protected void before() throws Throwable {
        if(counter == 0){
            System.out.println("init start");
            connection = "connection initialized";

        }
        counter++;
    };

    @Override
    protected void after() {
        counter--;
        if(counter == 0){
            System.out.println("init end");
            connection = null;
        }
    };

    public String getConnection() {
        return connection;
    }     
}

@RunWith(Suite.class)
@SuiteClasses({MyTestCase.class, MyTestCase2.class})
public class MyTestSuite {

    @ClassRule 
    public static ConnectionRule rule = ConnectionRule.newInstance();
}

public class MyTestCase {

    @ClassRule 
    public static ConnectionRule rule = MyTestSuite.rule;

    @Test
    public void test() {
        Assert.notNull(rule.getConnection());
    }
}

MyTestCase2完全相同。

1 个答案:

答案 0 :(得分:1)

将规则放在测试上,而不是TestSuite。

您可以扩展规则,以便:

  • 如果连接已经存在,则不会重新创建连接

  • 保留对连接的引用,因此以后的测试可以重用连接。

  • 对测试之间保持的连接的引用可能是soft or weak one